查询连接id匹配的行和存在的行

时间:2014-04-09 07:12:15

标签: php mysql sql join

我需要一个连接几个表的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...

3 个答案:

答案 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