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

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

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

  1. SELECT
  2. attribute.*,
  3. attribute_description.*,
  4. product_attribute.*
  5. FROM
  6. attribute
  7. INNER JOIN attribute_description ON attribute.attribute_id = attribute_description.attribute_id
  8. LEFT JOIN product_attribute ON attribute.attribute_id = product_attribute.attribute_id
  9. WHERE
  10. product_attribute.product_id = '.$product_id .'
  11. GROUP BY
  12. attribute.attribute_id,
  13. attribute_description.attribute_id,
  14. product_attribute.attribute_id

表格示例:

  1. attribute
  2. +----+--------------+--------------------+
  3. | id | attribute_id | attribute_group_id |
  4. +----+--------------+--------------------+
  5. | 1 | 1 | 1 |
  6. | 2 | 2 | 1 |
  7. | 3 | 3 | 1 |
  8. | 4 | 4 | 1 |
  9. | 5 | 5 | 1 |
  10. | 6 | 6 | 1 |
  11. +----+--------------+--------------------+
  12. attribute_description
  13. +----+--------------+--------------------+
  14. | id | attribute_id | name |
  15. +----+--------------+--------------------+
  16. | 1 | 1 | attribute name 1 |
  17. | 2 | 2 | attribute name 2 |
  18. | 3 | 3 | attribute name 3 |
  19. | 4 | 4 | attribute name 4 |
  20. | 5 | 5 | attribute name 5 |
  21. | 6 | 6 | attribute name 6 |
  22. +----+--------------+--------------------+
  23. product_attribute
  24. +----+--------------+--------------------+
  25. | id | attribute_id | product_id |
  26. +----+--------------+--------------------+
  27. | 1 | 1 | 1 |
  28. | 2 | 2 | 1 |
  29. | 3 | 3 | 1 |
  30. | 4 | 4 | 2 |
  31. | 5 | 5 | 2 |
  32. | 6 | 6 | 2 |
  33. +----+--------------+--------------------+
  34. What i am hoping to achieve: (expected output)
  35. +----+--------------+--------------------+-------------+
  36. | id | attribute_id | name | product_id |
  37. +----+--------------+--------------------+-------------+
  38. | 1 | 1 | attribute name 1 | 1 |
  39. | 2 | 2 | attribute name 2 | 1 |
  40. | 3 | 3 | attribute name 3 | 1 |
  41. | 4 | 4 | attribute name 4 | NULL |
  42. | 5 | 5 | attribute name 5 | NULL |
  43. | 6 | 6 | attribute name 6 | NULL |
  44. +----+--------------+--------------------+-------------+

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

qcbq4gxm

qcbq4gxm1#

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

  1. FROM attribute a JOIN
  2. attribute_description ad
  3. ON a.attribute_id = ad.attribute_id LEFT JOIN
  4. product_attribute pa
  5. ON pa.attribute_id = p.attribute_id AND
  6. pa.product_id = '.$product_id .'

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

plupiseo

plupiseo2#

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

  1. SELECT attribute.*, attribute_description.*, product_attribute.*
  2. FROM attribute
  3. INNER JOIN attribute_description ON attribute.attribute_id
  4. = attribute_description.attribute_id
  5. LEFT JOIN product_attribute ON attribute.attribute_id = product_attribute.attribute_id
  6. AND product_attribute.product_id = '.$product_id .'
  7. GROUP BY attribute.attribute_id, attribute_description.attribute_id, product_attribute.attribute_id

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

s5a0g9ez

s5a0g9ez3#

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

相关问题