如何基于主表的字段值联接到2个不同的表?

时间:2019-06-25 02:43:31

标签: mysql sql join

所以我有3个表,分别为menusproductscategories

菜单表具有ID,可以为product | category的item_type和item_id。

我想做的是menu item_type = product时,将其与产品表ON products.id = menu.item_id联接,然后与categories when item_type = category联接。

这是我当前的查询:

SELECT m.* FROM menus m 
LEFT JOIN products p ON p.id = m.item_id AND m.item_type = 'product' 
LEFT JOIN categories c ON c.id = m.item_id AND m.item_type = 'category'

尽管我没有看到每个菜单附带的任何产品或类别数据,但该查询仍然有效。

我在这里错过了什么吗?谢谢。

3 个答案:

答案 0 :(得分:5)

您需要SELECT所需的列。您只需要从menus表中选择列,这就是您得到的全部。

我建议从其他两个表中选择列,但使用COALESCE()将它们组合起来:

SELECT m.*,
       COALESCE(p.name, c.name) as name,  -- or whatever the columns are
       -- repeat for additional columns that you want
FROM menus m LEFT JOIN
     products p
     ON p.id = m.item_id AND m.item_type = 'product' LEFT JOIN
     categories c
     ON c.id = m.item_id AND m.item_type = 'category'

答案 1 :(得分:4)

您正在使用SELECT m.*

在菜单中选择值。

正确的查询是只使用*或您特别需要的字段。

SELECT * FROM menus m 
LEFT JOIN products p ON p.id = m.item_id AND m.item_type = 'product' 
LEFT JOIN categories c ON c.id = m.item_id AND m.item_type = 'category'

答案 2 :(得分:2)

您还需要将JOIN表的字段也包括在内,因为您只选择m表的字段。

最终,您可能还需要进行联接OUTER,以仍然包含与您的2个联接中的任何一个都不匹配的记录:例如:带有另一个item_type 的菜单(不是您现在可以看到的实际用例,顺便说一句)

SELECT m.*, p.*, c.* FROM menus m 
LEFT JOIN products p ON p.id = m.item_id AND m.item_type = 'product' 
LEFT JOIN categories c ON c.id = m.item_id AND m.item_type = 'category'

足以返回您所有的menu记录,其中一些仅包含产品信息(类别字段的NULL值),反之亦然:

    当item_type = category时,
  • p。*个值为NULL
  • 当item_type = menu时,
  • c。*个值为NULL