我需要一个MySQL查询,仅当那些表具有匹配的ID并且它实际上存在于表中时,该表才能联接多个表。我有1个父表和几个子表。父表包含每一行,而子表仅包含它们需要的行。如果父表具有子表之一中存在的ID,则需要将父表与子表连接。这是我当前正在使用的,不能正常工作。该查询最终没有结果,因为子表行可能不存在。例如,“小部件”表和“ widget_login”表中可能存在1行,因为该小部件是“ login”小部件,但所有其他表均为空。但是它仍然应该检查所有表。我不确定如何克服这个问题。SELECT FROM widgetsJOIN widget_login ON widget_login.id=widgets.idJOIN widget_admin ON widget_admin.id=widgets.idJOIN widget_facebook ON widget_facebook.id=widgets.idWHERE widgets.type='specific_type'etc... 最佳答案 删除引号。并添加列以进行选择,例如*。SELECT * FROM widgetsINNER JOIN widget_login ON widget_login.id=widgets.idINNER JOIN widget_admin ON widget_admin.id=widgets.idINNER JOIN widget_facebook ON widget_facebook.id=widgets.idWHERE ... etc etc编辑:如果只想从小部件中选择,则使用EXISTS:SELECT * FROM widgetsWHERE 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 widgetsWHERE 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 widgetsLEFT JOIN widget_login ON widget_login.id=widgets.idLEFT JOIN widget_admin ON widget_admin.id=widgets.idLEFT JOIN widget_facebook ON widget_facebook.id=widgets.idWHERE (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'。
10-07 20:15