我需要一个连接几个表的MySQL查询,只要这些表具有匹配的ID并且它实际存在于表中。
我有1个父表和几个子表。父表包含每一行,而子表仅包含它们所需的行。如果父表有一个存在于其中一个子表中的ID,我需要将子表与子表连接。
这是我目前使用的不起作用。此查询最终没有结果,因为子表行可能不存在。例如,"小部件中可能存在1行"表和" widget_login"因为小部件是"登录"小部件,但所有其他表都是空的。但它仍应检查所有表格。我不确定如何克服这一点。
SELECT FROM widgets
JOIN widget_login ON widget_login.id=widgets.id
JOIN widget_admin ON widget_admin.id=widgets.id
JOIN widget_facebook ON widget_facebook.id=widgets.id
WHERE widgets.type='specific_type'
etc...
答案 0 :(得分:1)
删除引号。并添加要选择的列,例如*
SELECT * FROM widgets
INNER JOIN widget_login ON widget_login.id=widgets.id
INNER JOIN widget_admin ON widget_admin.id=widgets.id
INNER JOIN widget_facebook ON widget_facebook.id=widgets.id
WHERE ... etc etc
编辑:如果您只想从小部件中进行选择,请使用EXISTS:
SELECT * FROM widgets
WHERE EXISTS (select * from widget_login where widget_login.id=widgets.id)
AND EXISTS (select * from widget_admin ON widget_admin.id=widgets.id)
AND EXISTS (select * from widget_facebook ON widget_facebook.id=widgets.id)
WHERE ... etc etc
或IN:
SELECT * FROM widgets
WHERE id IN (select id from widget_login)
AND id IN (select id from widget_admin)
AND id IN (select id from widget_facebook)
WHERE ... etc etc
顺便说一句:各种表格的ID相等似乎很奇怪。表小部件中名为ID的列应标识小部件记录,而表widget_login中的名为ID的列应标识登录记录。检查一下;也许你会混淆ID。
编辑:还有一句话:如果您正在寻找三个表中至少有一个表中存在的小部件,请使用EXISTS或IN与OR而不是AND。
编辑:要连接所有表并确保至少有一个表中的小部件存在,请使用外部联接并检查结果是否为空:
SELECT * FROM widgets
LEFT JOIN widget_login ON widget_login.id=widgets.id
LEFT JOIN widget_admin ON widget_admin.id=widgets.id
LEFT JOIN widget_facebook ON widget_facebook.id=widgets.id
WHERE (widget_login.id IS NOT NULL OR widget_admin.id IS NOT NULL OR widget_facebook.id IS NOT NULL)
AND ... etc etc
请注意进一步的标准,其他表的列对于记录可以为null。例如。添加AND widget_admin.name<> ' BAD'将删除所有外部联接记录,因为NULL不是<> ' BAD'
答案 1 :(得分:1)
用LEFT JOIN替换JOIN。它从连接表中获取小部件和相关行(如果存在)的所有行
SELECT FROM widgets
LEFT JOIN widget_login ON widget_login.id=widgets.id
LEFT JOIN widget_admin ON widget_admin.id=widgets.id
LEFT JOIN widget_facebook ON widget_facebook.id=widgets.id
WHERE ... etc etc
答案 2 :(得分:0)
这实际上等于INNER JOIN。但只有在所有子表中都存在id时才会显示记录。您可以修改WHERE
条件以过滤行
SELECT FROM widgets
LEFT OUTER JOIN widget_login ON widget_login.id=widgets.id
LEFT OUTER JOIN widget_admin ON widget_admin.id=widgets.id
LEFT OUTER JOIN widget_facebook ON widget_facebook.id=widgets.id
WHERE widget_login.id IS NOT NULL
AND widget_admin.id IS NOT NULL
AND widget_facebook.id IS NOT NULL