33

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


group_id
关键字_

B
id
group_id
user_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']}在这种情况下,它还将包括用户已经在其中的组——这不是我想要的。

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

4

4 回答 4

46

只需将额外的条件移动到 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
于 2013-05-19T18:20:08.123 回答
22

正确答案很简单:

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 不在的任何组。

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

演示在这里

于 2015-05-02T10:57:23.310 回答
0
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."%';
于 2013-10-25T00:40:48.383 回答
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%'

完整示例

于 2021-04-26T12:49:20.700 回答