我有这个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分组,但没有成功。
希望有人能给我指出正确的方向,这样我就能理解我的问题并解决它。
3条答案
按热度按时间qcbq4gxm1#
您需要将过滤条件移动到
on
条款:你的版本不起作用,因为它返回
NULL
为了product_id
在不匹配的行上。这个WHERE
子句过滤掉这些。plupiseo2#
我想是因为你有where子句。where子句使结果只显示3行。如果你想让属性和它的描述都显示在特定的产品中,也许你可以像这样改变where子句在左边连接的条件
这一切都是因为在加入产品之后,您的产品id为null,并且您添加where子句来精确输入
s5a0g9ez3#
当您使用left join并且需要右侧其他表的所有记录时,您不应该将该表的条件放在“where”子句上,因为所有记录都是由where子句过滤的,所以您应该在“on”中使用您的条件