左连接返回第一个表的所有结果

bxfogqkk  于 2021-08-13  发布在  Java
关注(0)|答案(3)|浏览(301)

我有这个sql查询($product\u id=1)

SELECT
    attribute.*,
    attribute_description.*,
    product_attribute.*
FROM
    attribute
INNER JOIN attribute_description ON attribute.attribute_id = attribute_description.attribute_id
LEFT JOIN product_attribute ON attribute.attribute_id = product_attribute.attribute_id
WHERE
    product_attribute.product_id = '.$product_id .'
GROUP BY
    attribute.attribute_id,
    attribute_description.attribute_id,
    product_attribute.attribute_id

表格示例:

attribute
+----+--------------+--------------------+
| id | attribute_id | attribute_group_id |
+----+--------------+--------------------+
|  1 |            1 |                  1 | 
|  2 |            2 |                  1 |
|  3 |            3 |                  1 |
|  4 |            4 |                  1 |
|  5 |            5 |                  1 |
|  6 |            6 |                  1 |
+----+--------------+--------------------+

attribute_description
+----+--------------+--------------------+
| id | attribute_id |               name |
+----+--------------+--------------------+
|  1 |            1 |   attribute name 1 | 
|  2 |            2 |   attribute name 2 |
|  3 |            3 |   attribute name 3 |
|  4 |            4 |   attribute name 4 |
|  5 |            5 |   attribute name 5 |
|  6 |            6 |   attribute name 6 |
+----+--------------+--------------------+

product_attribute
+----+--------------+--------------------+
| id | attribute_id |         product_id | 
+----+--------------+--------------------+
|  1 |            1 |                  1 | 
|  2 |            2 |                  1 |
|  3 |            3 |                  1 |
|  4 |            4 |                  2 |
|  5 |            5 |                  2 |
|  6 |            6 |                  2 |
+----+--------------+--------------------+

What i am hoping to achieve: (expected output)
+----+--------------+--------------------+-------------+
| id | attribute_id |               name |  product_id |
+----+--------------+--------------------+-------------+
|  1 |            1 |   attribute name 1 |           1 |
|  2 |            2 |   attribute name 2 |           1 |
|  3 |            3 |   attribute name 3 |           1 |
|  4 |            4 |   attribute name 4 |        NULL |
|  5 |            5 |   attribute name 5 |        NULL |
|  6 |            6 |   attribute name 6 |        NULL |
+----+--------------+--------------------+-------------+

我想得到表属性和属性描述的所有内容,以及满足where子句的产品属性的3个结果。
不幸的是,当我添加最后一个左join和where子句时,只返回了3个结果,根据我的理解,我应该接收前两个表的所有结果。
我试图理解mysql-left-join并没有返回所有的行,尽管我不确定我是否正确理解它,尽管这个问题看起来很相似。
我确实试过按所有的table分组,但没有成功。
希望有人能给我指出正确的方向,这样我就能理解我的问题并解决它。

qcbq4gxm

qcbq4gxm1#

您需要将过滤条件移动到 on 条款:

FROM attribute a JOIN
     attribute_description ad
     ON a.attribute_id = ad.attribute_id LEFT JOIN
     product_attribute pa
     ON pa.attribute_id = p.attribute_id AND
        pa.product_id = '.$product_id .'

你的版本不起作用,因为它返回 NULL 为了 product_id 在不匹配的行上。这个 WHERE 子句过滤掉这些。

plupiseo

plupiseo2#

我想是因为你有where子句。where子句使结果只显示3行。如果你想让属性和它的描述都显示在特定的产品中,也许你可以像这样改变where子句在左边连接的条件

SELECT attribute.*, attribute_description.*, product_attribute.*  
FROM attribute  
INNER JOIN attribute_description ON attribute.attribute_id
    = attribute_description.attribute_id  
LEFT JOIN product_attribute ON attribute.attribute_id = product_attribute.attribute_id  
AND product_attribute.product_id = '.$product_id .'  
GROUP BY attribute.attribute_id, attribute_description.attribute_id, product_attribute.attribute_id

这一切都是因为在加入产品之后,您的产品id为null,并且您添加where子句来精确输入

s5a0g9ez

s5a0g9ez3#

当您使用left join并且需要右侧其他表的所有记录时,您不应该将该表的条件放在“where”子句上,因为所有记录都是由where子句过滤的,所以您应该在“on”中使用您的条件

相关问题