簡體   English   中英

選擇具有左外部聯接和條件的行-MySQL

[英]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

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

您實際上不需要使用外部聯接。 當您要查看一個表中的所有行時,無論它們在另一表中的情況如何,通常都使用外部聯接。 盡管在這種情況下它可以工作(如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM