选择具有Left Outer Join和条件的行--MySQL

时间:2014-10-24 14:57:49

标签: mysql join conditional-statements

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

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

http://sqlfiddle.com/#!2/665b6/1

答案 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`