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);