Php 查询以联接id匹配且存在行的表

Php 查询以联接id匹配且存在行的表,php,mysql,sql,join,Php,Mysql,Sql,Join,我需要一个MySQL查询,只有当这些表具有匹配的ID并且它实际上存在于表中时,它才会连接多个表 我有一个父表和几个子表。父表包含每一行,而子表只包含它们需要的行。如果父表的ID存在于其中一个子表中,我需要将父表与子表连接起来 这是我目前使用的不起作用的东西。此查询最终没有结果,因为子表行可能不存在。例如,“widgets”表和“widget\u login”表中可能存在1行,因为该小部件是“login”小部件,但所有其他表都是空的。但它仍然应该检查所有表。我不知道如何克服这个问题 SELECT

我需要一个MySQL查询,只有当这些表具有匹配的ID并且它实际上存在于表中时,它才会连接多个表

我有一个父表和几个子表。父表包含每一行,而子表只包含它们需要的行。如果父表的ID存在于其中一个子表中,我需要将父表与子表连接起来

这是我目前使用的不起作用的东西。此查询最终没有结果,因为子表行可能不存在。例如,“widgets”表和“widget\u login”表中可能存在1行,因为该小部件是“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...

删除引号。并添加要选择的列,例如*

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
或在:

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的列应标识小部件记录,而表小部件中名为ID的列应标识登录记录。检查这个;也许你混淆了身份证

编辑:还有一句话:如果要查找至少存在于三个表中的一个表中的小部件,请使用EXISTS或in with或代替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。例如,添加和使用widget_admin.name“BAD”将删除所有外部连接的记录,因为NULL不是“BAD”。

删除引号。并添加要选择的列,例如*

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
或在:

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的列应标识小部件记录,而表小部件中名为ID的列应标识登录记录。检查这个;也许你混淆了身份证

编辑:还有一句话:如果要查找至少存在于三个表中的一个表中的小部件,请使用EXISTS或in with或代替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。例如,添加和使用widget_admin.name“BAD”将删除所有外部连接的记录,因为NULL不是“BAD”。

删除引号。并添加要选择的列,例如*

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
或在:

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的列应标识小部件记录,而表小部件中名为ID的列应标识登录记录。检查这个;也许你混淆了身份证

编辑:还有一句话:如果要查找至少存在于三个表中的一个表中的小部件,请使用EXISTS或in with或代替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。例如,添加和使用widget_admin.name“BAD”将删除所有外部连接的记录,因为NULL不是“BAD”。

删除引号。并添加要选择的列,例如*

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
或在:

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的列应标识小部件记录,而表小部件中名为ID的列应标识登录记录。检查这个;也许你混淆了身份证

编辑:还有一句话:如果要查找至少存在于三个表中的一个表中的小部件,请使用EXISTS或in with或代替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。例如,添加和使用widget_admin.name“BAD”将删除所有外部联接记录,因为NULL不是“BAD”。

用左联接替换联接。它从窗口小部件获取所有行,并从联接表获取相关行(如果存在)

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

将联接替换为左联接。它从窗口小部件获取所有行,并从联接表获取相关行(如果存在)

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

将联接替换为左联接。它从窗口小部件获取所有行,并从联接表获取相关行(如果存在)

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

将联接替换为左联接。它从窗口小部件获取所有行,并从联接表获取相关行(如果存在)

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

这实际上等于内部联接。但仅当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

这实际上等于内部联接。但仅当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

这实际上等于内部联接。但仅当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

这实际上等于内部联接。但仅当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

如果只需要存在于所有子表中的匹配行,则可以使用此方法;否则,如果需要显示父表中的每一行,即使它们存在于子表中或不存在于子表中,也可以使用LEFT-OUTER-JOIN。是否仍要从chil中删除行