2016-01-14 23 views
1

我有三个表(product,product_description,product_store_description)。即使连接数据为空,Mysql如何返回行

产品

此表有一行

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

PRODUCT_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小提琴HERE,不幸的是我还没有能够得到任何人的工作答案。

+0

说明字段必须具有相同的值吗? (表的模式非常糟糕和冗余) – MTroy

+0

@MTroy:看起来像第二个表中的描述是依赖于语言的,在第三个表中它可以根据商店进一步进行本地化。如果不理解应用程序,您不应该对设计做出价值判断。 – PaulF

回答

2

如果表product是包含ATLEAST一个数据。并且您要显示其他列NULL或自定义字符串,如"---",即使连接属性为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); 
+1

太棒了!这工作完美。解决方案并不像我想的那么简单,谢谢。 – TarranJones

0

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

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

+0

@Shadow:感谢编辑 - 在添加细节之前,我被同事分散注意力。 – PaulF

+0

谢谢,但我用左连接开始,这返回0行。 – TarranJones

+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'; _ – PaulF

-1

如果你想获得一些数据,你应该这样执行查询:

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

+0

这将返回任何商店或任何语言的描述 – TarranJones

+0

@TarranJones这就是为什么我写道“但在这种情况下,你手动不得不控制值的语言和store_id” – KLin