MySQL LEFT JOIN 多个条件

Posted

技术标签:

【中文标题】MySQL LEFT JOIN 多个条件【英文标题】:MySQL LEFT JOIN Multiple Conditions 【发布时间】:2013-05-14 07:50:46 【问题描述】:

我有两个表:由“group_id”链接的 A 和 B。 我正在使用的 2 个变量:$keyword, $_SESSION['user_id']

A group_id 关键字

B 身份证 group_id 用户ID

我希望能够根据关键字搜索选择该用户不在的所有组。

因此,目标是选择 A 中的所有行,其中 user_id!=$_SESSION['user_id' 对应于 B 中的 group_id 并喜欢关键字。

这是我尝试过的:

SELECT a.* 
FROM a 
LEFT JOIN b ON a.group_id=b.group_id 
WHERE a.keyword LIKE '%".$keyword."%' 
AND b.user_id!=$_SESSION['user_id'] 
GROUP BY group_id

但是,除非我删除 AND b.user_id!=$_SESSION['user_id'],否则它不会找到任何行(匹配项),在这种情况下,它还将包括用户已经在其中的组 - 这不是我想要的。

任何帮助将不胜感激!谢谢

【问题讨论】:

en.wikipedia.org/wiki/Prepared_statements 【参考方案1】:

只需将多余的条件移到JOIN ON条件中,这样就不需要b的存在来返回结果

SELECT a.* FROM a 
    LEFT JOIN b ON a.group_id=b.group_id AND b.user_id!=$_SESSION['user_id'] 
    WHERE a.keyword LIKE '%".$keyword."%' 
    GROUP BY group_id

【讨论】:

感谢您的回复,但是,这不起作用。它只返回表“a”中的所有行,包括 b.user_id 等于 $_SESSION['user_id'] 的行。我不知道为什么,但我认为这与它是左连接这一事实有关? 我认为您已经足够接近知道答案 :) 尝试使用 INNER JOIN 而不是左连接 No INNER JOIN 不起作用。如果我使用 INNER JOIN 那么它只会从表 A 中提取在表 B 中具有相应 group_id 的行。我需要它来拉表 A 中的所有行,除了 user_id = $_SESSION['user_id'] (对于 B 中的特定 group_id)。【参考方案2】:
SELECT * FROM a WHERE a.group_id IN 
(SELECT group_id FROM b WHERE b.user_id!=$_SESSION'[user_id'] AND b.group_id = a.group_id)
WHERE a.keyword LIKE '%".$keyword."%';

【讨论】:

【参考方案3】:

正确答案很简单:

SELECT a.group_id
FROM a 
LEFT JOIN b ON a.group_id=b.group_id  and b.user_id = 4
where b.user_id is null
  and a.keyword like '%keyword%'

在这里,我们正在检查user_id = 4(您在会话中的用户 ID)。由于我们在连接条件中有它,它将为表 b 中与条件不匹配的任何行返回空值 - 即,该 user_id 不在的任何组。

从那里,我们需要做的就是过滤空值,并且我们拥有您的用户不在的所有组。

demo here

【讨论】:

【参考方案4】:

以上答案都是正确的。实现这一目标的另一种方法是;

SELECT a.group_id
FROM a 
LEFT JOIN b ON (a.group_id, b.user_id) = (b.group_id, 4)
where b.user_id is null
  and a.keyword like '%keyword%'

Complete Example

【讨论】:

以上是关于MySQL LEFT JOIN 多个条件的主要内容,如果未能解决你的问题,请参考以下文章

mysql 优化慢复杂sql (多个left join 数量过大 order by 巨慢)

MS Access - SQL LEFT JOIN 多个条件

mysql,left join查询,数据变多了????

MySQL LEFT JOIN 不能处理多个表

sql中left join on 多个条件需要特殊注意之处

使用 LEFT JOIN 更新 MySQL 中的多个表