Query

選擇與存在結合的位置

  • November 22, 2020

dating_users

user_id | username
---------+----------
     11 | taimoor
     13 | jacob
     14 | pi
(3 rows)

dating_likes

like_id | user_id | liked_user
---------+---------+------------
     54 |      11 |         13
     56 |      13 |         11
     57 |      11 |         14
(3 rows)

我想在使用者喜歡某人的地方找到喜歡的人,並且有人喜歡他們。這是我的查詢:

select like_id from dating_likes where user_id = 11 and exists(select like_id from dating_likes where liked_user = 11);

結果:

like_id
---------
     54
     57
(2 rows)

這應該只導致第一行,因為54is a like where theuser_id = 11和 there is a like 56where liked_user = 11。Like57不應該出現,因為它不是相互的 - 真實的user_id是 11。

將其視為必須相等的兩種不同的喜歡:

select b_likes_a.liked_user
from dating_likes a_likes_b
join dating_likes b_likes_a
 on  a_likes_b.user_id = b_likes_a.liked_user
 and a_likes_b.liked_user = b_likes_a.user_id
where a_likes_b.user_id = 11

a_likes_b並且b_likes_a是 的表別名dating_likes

從這裡我們也看到這like_id是沒有意義的,可以省略。(user_id,liked_user)是一個足夠的主鍵。

這是我的解決方案

select t.*
from dating_likes t
where exists (select t1.like_id,t1.user_id
             from dating_likes t1
             where t.user_id = t1.liked_user and
                   t.liked_user = t1.user_id)

輸出是這樣的:

like_id  User_id   Liked_user
56       13          11
54       11          13

我不知道哪種解決方案(使用 Join 或 Exist)在性能方面更好,但我想知道是否有人想分享他們的意見。謝謝

引用自:https://dba.stackexchange.com/questions/280106