PEOPLE PEOPLE_FAVS
id user_id fav_id
------ ------- ----------
1 1 1
2 1 2
3 1 5
4 2 1
5 2 2
6
我有两个表PEOPLE和PEOPLE_FAVS,我试图让所有没有收藏数字的人都没有#5;' 5'所以它应该返回
PEOPLE
id
------
2
3
4
5
6
我正在尝试使用此查询:
SELECT `people`.`id`
FROM `people`
LEFT OUTER JOIN `people_favs` ON (`people_favs`.`user_id` = `people`.`id`)
WHERE (`people_favs`.`fav_id` != 5)
GROUP BY `people`.`id`
这是一个SQL小提琴:http://sqlfiddle.com/#!2/4102b8/3
答案 0 :(得分:1)
SELECT p.*
FROM people p
LEFT
JOIN people_favs pf
ON pf.user_id = p.id
AND pf.fav_id = 5
WHERE pf.fav_id IS NULL
答案 1 :(得分:0)
您实际上并不需要使用外部联接。当您想要查看一个表中的所有行时,通常会使用外部联接,而不管它们与另一个表的条件如何。虽然它可以在这种情况下工作(如Strawberry的示例所示),但您可以使用NOT EXISTS
运算符来检查没有5作为收藏的ID。
据我所知,几乎没有性能差异,但这个查询有点短。我也觉得它更符合逻辑,因为你并没有加入信息。这只是个人意见/想法。
试试这个:
SELECT id
FROM people
WHERE NOT EXISTS(SELECT id FROM people_favs WHERE fav_id = 5 AND user_id = id);
SQLFiddle使用您的数据的示例。
答案 2 :(得分:-2)
您是否尝试过这样做:
SELECT DISTINCT `people`.`id`
FROM `people`
JOIN `people_favs` ON (`people_favs`.`user_id` = `people`.`id`)
WHERE (`people_favs`.`fav_id` <> 5)
GROUP BY `people`.`id`