[英]Select rows with Left Outer Join and condition - MySQL
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'的PEOPLE,所以它应该返回
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
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
您实际上不需要使用外部联接。 当您要查看一个表中的所有行时,无论它们在另一表中的情况如何,通常都使用外部联接。 尽管在这种情况下它可以工作(如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示例使用您的数据。
您是否尝试简单地做到这一点:
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`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.