Php Mysql如何在连接数据为空的情况下返回行
我有三个表(Php Mysql如何在连接数据为空的情况下返回行,php,mysql,join,Php,Mysql,Join,我有三个表(product,product\u description,product\u store\u description) 产品 这张桌子有一排 +----------+---------------------+ |product_id| description | +----------+---------------------+ | 1 |'regular description'| +----------+--------------------
product
,product\u description
,product\u store\u description
)
产品
这张桌子有一排
+----------+---------------------+
|product_id| description |
+----------+---------------------+
| 1 |'regular description'|
+----------+---------------------+
产品描述
This table has zero rows
+----------+-----------+--------+--------+
|product_id|description|language|store_id|
+----------+-----------+--------+--------+
此表没有行
+----------+-----------+--------+
|product_id|description|language|
+----------+-----------+--------+
产品\商店\说明
This table has zero rows
+----------+-----------+--------+--------+
|product_id|description|language|store_id|
+----------+-----------+--------+--------+
我想返回所有表的.description
列,其中product.product\u id='1'
所以在这种情况下,我想要的输出是
$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示例表,不幸的是我还没有找到任何人的答案。如果我理解正确,那么您需要左连接,因为产品表位于查询中连接的左侧
Left join将返回join运算符左侧表中的所有行,而right join将返回join运算符右侧表中的所有行。如果要接收某些数据,应执行如下查询:
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);
但在这种情况下,如果table
product
至少包含一个数据,您必须手动控制language的值并存储_id。并且您希望显示其他列NULL
或自定义字符串,如“--”
,您必须在查询中指定join,即使join属性为NULL。所以下面的查询将为您提供数据
说明字段必须具有相同的值?(表的模式非常糟糕和冗余)@MTroy:看起来第二个表中的描述与语言有关,第三个表中的描述可以根据存储进一步本地化。在不了解应用程序的情况下,您不应对设计进行价值判断。@Shadow:谢谢您的编辑-在添加详细信息之前,我被一位同事分心了。谢谢,但我从左连接开始,这将返回0行。尝试将第二/第三个表条件向上移动到连接:选择p.description作为p\u description,pd.description作为pd_description,psd.description作为psd_description作为p LEFTJOIN product_description作为pd ON(pd.product_id=p.product_id)和pd.language='en'作为psd ON(psd.product_id=p.product_id)和psd.language='en'和psd.store_id=1,其中p.product_id='1';这将返回任何存储或任何应用程序的描述langauge@TarranJones这就是我为什么写“但在这种情况下,您必须手动控制语言的值并存储_id”的原因,太棒了!这很好用。这个解决方案并不像我想的那么简单,谢谢。多年来,我一直在寻找这个解决方案,最终找到了它。谢谢你Mayur Deore,你的建议对我有用。
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);