首页 > 解决方案 > MYSQL:仅返回与两个没有冲突的表匹配

问题描述

我想知道这是否可以只用一个查询来完成。

你看,我有这个表user_leads,我需要加入这个表两个表:lead_formsuser_services分别在formidserviceid列上。

此查询的结果应仅返回与 user_services 或 lead_forms 匹配的行。不要在这两个中的至少一个上返回不匹配的行。

由于这两列的性质,两者都可以设置,有时会设置一个而另一个为 NULL。通常这两个表中的任何一个都不匹配。

所以问题是,如果我像这样进行内部连接

FROM `user_leads`
INNER JOIN lead_forms ON lead_forms.formid = user_leads.formid

但是然后做

INNER JOIN user_services ON user_services.serviceid = user_leads.serviceid

它将返回与lead_forms 匹配的所有匹配,并在应该返回它们时忽略与user_services的一些匹配项。如果我执行以下操作

FROM `user_leads`
WHERE user_leads.formid > 0 OR user_leads.serviceid > 0
LEFT OUTER JOIN user_services ON user_leads.serviceid = user_services.serviceid
LEFT OUTER JOIN lead_forms ON user_leads.serviceid = lead_forms.formid

就像我想要的那样,它返回两个表中的所有匹配项,但是由于它是 LEFT OUTER JOIN 它还返回来自 user_leads 的行,这些行在 user_serviceslead_forms中没有匹配,从而导致错误。

我不想检查匹配项,除非真的没有其他方法可以用 MYSQL 做到这一点。因此,如果您知道执行此操作的正确方法,我们将不胜感激。

编辑:供参考https://www.db-fiddle.com/f/pvjnJSAb913EX5Qc7c2QWo/1

这就是有效的https://www.db-fiddle.com/f/5tgwy9AgBHx2dcqt9NoThN/2

标签: phpmysql

解决方案


LEFT如果您添加条件以使至少 1 个连接列不为空,则连接将执行您想要的操作:

LEFT OUTER JOIN user_services ON user_leads.serviceid = user_services.serviceid
LEFT OUTER JOIN lead_forms ON user_leads.serviceid = lead_forms.formid
WHERE user_services.serviceid IS NOT NULL OR lead_forms.formid IS NOT NULL

推荐阅读