簡體   English   中英

如何修復Sql查詢

[英]How to fix Sql query

我一直在嘗試獲取一個查詢以返回用戶擁有的朋友,在我的成員表中,我有成員的用戶ID,名字和姓氏,我在朋友表中有用戶ID列和朋友ID列,現在我我將我的會員表與朋友表相結合,這樣我就能得到朋友的名字。

用戶表

user_id名字姓氏

   2      John        drake         
   3       Hamer      Joy       
   4        Finter     Richy    

朋友表

friends_id user_id friend_id

   1           2          3         
   2            4         2         
   3            4         3

這是我執行的查詢

SELECT a.friends_id,a.user_id, 
       a.friend_id, b.firstname, b.lastname
FROM friends AS a,users As b
WHERE (a.friend_id = b.user_id OR a.user_id = b.user_id) AND
      (a.friend_id = 2 OR a.user_id =2)

這是我得到的結果

friends_id  user_id  friend_id  firstname   lastname    
   1           2       3          John      drake       
   1           2       3          Hamer     Joy         
   3           4       2          John      drake       
   3           4       2           Finter    Richy  

這是我期待的結果

friends_id  user_id  friend_id  firstname   lastname    
   1           2       3          Hamer     Joy         
   3           4       2           Finter    Richy

也許是指定個人朋友的union以及將他作為朋友的用戶:

select a.friends_id, a.user_id, a.friend_id, b.firstname, b.lastname
from friends a, users b
where a.user_id = 2 and b.user_id = a.friend_id 

union

select a.friends_id, a.user_id, a.friend_id, b.firstname, b.lastname
from friends a, users b
where a.friend_id = 2 and b.user_id = a.user_id

這是由2個內部查詢的union產生的所有單個查詢。

我認為您的原始查詢的問題是您在聯接中使用OR條件。 通常情況下,OR在連接條件下沒有幫助。

這是另一個更短的解決方案,並使用ANSI連接語法,因此您可以清楚地看到投影。 免責聲明,我沒有在數據庫中測試過,因此可能存在錯誤。 但是,如果您願意,也可以訪問原始用戶名(我已將其添加為最后兩列)。

select F.friends_id, U.user_id, FR.user_id,
    FR.firstname, FR.lastname,
    U.firstname, U.lastname
FROM users U join Friends F on
        U.user_id = F.user_id
    JOIN Users FR on
        F.friend_id = FR.user_id
where U.user_id = 2 or FR.user_id = 2
;

作為一般規則,使用ANSI連接語法可以使查詢更容易閱讀,並有助於確保指定所有連接條件。 它還使您可以輕松訪問更多聯接類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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