MySQL LEFT JOIN多条件

时间:2013-05-19 18:17:41

标签: mysql join

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

A
GROUP_ID
关键字


ID
GROUP_ID
USER_ID

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

因此,目标是选择A WHERE中的所有行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']},在这种情况下它还会包含用户已经在的组 - 这不是我想要的。

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

4 个答案:

答案 0 :(得分:38)

只需将额外条件移动到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

答案 1 :(得分:11)

正确答案很简单:

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

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."%';