所以我有3个表,分别为menus
,products
和categories
。
菜单表具有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'
尽管我没有看到每个菜单附带的任何产品或类别数据,但该查询仍然有效。
我在这里错过了什么吗?谢谢。
答案 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
值),反之亦然:
NULL
的NULL
的