【问题标题】:Mysql how to return rows even if join data is empty即使连接数据为空,Mysql如何返回行
【发布时间】:2016-04-19 17:35:29
【问题描述】:

我有三张桌子(productproduct_descriptionproduct_store_description)。

产品

这个表只有一行

+----------+---------------------+
|product_id|      description    |
+----------+---------------------+
|    1     |'regular description'|
+----------+---------------------+

产品描述

此表有零行

+----------+-----------+--------+
|product_id|description|language|
+----------+-----------+--------+

product_store_description

This table has zero rows

+----------+-----------+--------+--------+
|product_id|description|language|store_id|
+----------+-----------+--------+--------+

我想为所有表WHERE product.product_id = '1' 返回.description 列。

所以在这种情况下,我想要的输出是

$row = $result->fetch_assoc();
echo '<pre>';
var_dump($row);
echo '</pre>';

array (size=3)
    'p_description' => string 'regular description' (length=19)
    'pd_description' => string '' (length=0)
    'psd_description' => string '' (length=0)

我已经尝试了我的 SQL 的许多变体,这就是目前的情况。

SELECT p.description AS p_description ,pd.description AS pd_description, psd.description AS psd_description FROM product AS p 
RIGHT JOIN product_description AS pd ON(pd.product_id = p.product_id)
RIGHT JOIN product_store_description AS psd ON(psd.product_id = p.product_id) 
WHERE p.product_id = '1'
AND pd.language = 'en'
AND psd.language = 'en' AND psd.store_id = 1;

这将返回零行

我搜索了导致我使用RIGHT JOIN 的答案,但这并没有解决我的问题。

我已经为示例表创建了一个 SQL fiddle HERE,不幸的是我还没有让任何人回答工作。

【问题讨论】:

  • 描述字段必须具有相同的值? (表的架构非常糟糕和冗余)
  • @MTroy:看起来第二个表中的描述取决于语言,在第三个表中它可以根据商店进一步本地化。在不了解应用程序的情况下,您不应对设计进行价值判断。

标签: php mysql join


【解决方案1】:

如果我的理解正确,那么您需要 LEFT 联接,因为产品表位于查询中联接的左侧。

左连接将返回连接运算符左侧表中的所有行,而右连接将返回连接运算符右侧表中的所有行。

【讨论】:

  • 谢谢,但我从左连接开始,返回 0 行。
  • 尝试将第 2/3 个表条件向上移动到连接:SELECT p.description AS p_description ,pd.description AS pd_description, psd.description AS psd_description FROM product AS p LEFTJOIN product_description AS pd ON(pd.product_id = p.product_id) AND pd.language = 'en' LEFT JOIN product_store_description AS psd ON(psd.product_id = p.product_id) AND psd.language = 'en' AND psd.store_id = 1 WHERE p. product_id = '1';
【解决方案2】:

如果你想接收一些数据,你应该像这样执行查询:

SELECT 
   p.description AS p_description ,
   pd.description AS pd_description, 
   psd.description AS psd_description,
   pd.language as language,
   psd.store_id as store_id
FROM 
   product AS p LEFT JOIN product_description AS pd ON(pd.product_id = p.product_id) 
   LEFT JOIN product_store_description AS psd ON(psd.product_id = p.product_id) 
WHERE 
   p.product_id = '1'

但在这种情况下,您必须手动控制语言和 store_id 的值

【讨论】:

  • 这将返回任何商店或任何语言的描述
  • @TarranJones 这就是我写“但在这种情况下您必须手动控制语言和 store_id 的值”的原因
【解决方案3】:

如果表 product 包含至少一个数据。并且您想显示其他列 NULL 或自定义字符串(如 "---"),即使加入属性为空,您也必须在查询中指定加入。所以下面的查询会给你数据。

SELECT
p.description AS p_description ,ifnull(pd.description,"---") AS pd_description,
ifnull(psd.description,"--") AS psd_description
FROM product AS p
LEFT JOIN Product_description AS pd ON(pd.product_id = p.product_id)
LEFT JOIN product_store_description AS psd ON(psd.product_id = p.product_id)
WHERE p.product_id = '1' AND (pd.language = 'en' or pd.language is null)
AND (psd.language = 'en' or psd.language is null) AND 
(psd.store_id = 1 or psd.store_id is null);

【讨论】:

    猜你喜欢
    • 2012-04-19
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多