2012-06-21 185 views
1

我想得到我的朋友不是我朋友的朋友。 我有一個表是這樣的: userFriends(ID用戶,idUserFriend)選擇朋友的朋友sql的性能(但不是我的朋友)

我在想是這樣的:

select distinct idUserFriend from userFriends where idUser in 
(select idUserFriend from userFriends where idUser = 1) 
and idUserFriend not in (select idUserFriend from userFriends where idUser = 1) 

但我不知道它這麼慢,或者如果它可以更快其他方式。

對此有何看法?

+0

一下這個查詢結果? –

+0

它返回良好的數據。 – Alvaro

+0

那麼什麼是問題?性能問題? –

回答

3
SELECT DISTINCT 
    two.idUserFriend 
FROM userFriends one 
JOIN userFriends two ON one.idUserFriend = two.idUser 
WHERE NOT EXISTS (
     SELECT * 
     FROM userFriends nx 
     WHERE nx.idUser = one.idUser 
     AND nx.idUserFriend = two.idUserFriend 
     ) 
AND one.idUser = 1 
     ; 

同樣可以通過 「NOT IN」 來完成構建:

SELECT DISTINCT 
    two.idUserFriend 
FROM userFriends one 
JOIN userFriends two ON one.idUserFriend = two.idUser 
WHERE two.idUserFriend NOT IN (
     SELECT nx.idUserFriend 
     FROM userFriends nx 
     WHERE nx.idUser = one.idUser 
     ) 
AND one.idUser = 1 
     ; 

而且有 「除」 版本:

SELECT DISTINCT 
    two.idUserFriend 
FROM userFriends one 
JOIN userFriends two ON one.idUserFriend = two.idUser 
WHERE one.idUser = 1 
EXCEPT (
     SELECT nx.idUserFriend 
     FROM userFriends nx 
     WHERE nx.idUser = 1 
     ) 
     ; 
+0

+1 NOT IN使用 – ChelseaStats

+0

甚至可以通過使用除外條款來完成。 – wildplasser

+0

第一個給出與第二個不同的結果。 第二個人需要一個獨特的onder不要得到重複的結果。 第二個是不錯的反正:) – Alvaro

1

使用加入,使比較:

SELECT 
    b.idUserFriend 
FROM 
    userFriends a 
INNER JOIN 
    userFriends b ON a.idUserFriend = b.idUser 
LEFT JOIN 
    userFriends c ON a.idUser = c.idUser AND b.idUserFriend = c.idUserFriend 
WHERE 
    a.idUser = 1 
    AND c.idUser IS NULL 
GROUP BY 
    b.idUserFriend #eliminate duplicates 

通常情況下,最好是使用JOIN結束了子查詢,他們將利用上比較相關領域的指標。另一方面,子查詢將針對每個返回的行執行,即使它是不相關的子查詢(MySQL)。在JOINs vs Subqueries

+0

這個給我所有的朋友朋友。即使是我已經成爲朋友的那些人。所以這不是我正在尋找的。 – Alvaro

+0

糟糕!抱歉。修正了,但仍設法避免子查詢。現在就試試。 –

+0

好吧,它只是需要一個獨特的,以避免重複。但是..它比wildplasser提出的更快嗎? – Alvaro

1
select myFriend.idUserFriend from userFriend me inner join userFriends myFriend 
on me.idUserFriend = myFriend.idUser and myFriend.idUserFriend != me.idUserFriend 
where me.idUser='MyUserId'; 
1

更多信息試試這個 -

SELECT UF2.idUser, UF2.idUserFriend 
FROM USERFIRENDS UF2 INNER JOIN 
(
    SELECT idUser, idUserFriend 
    FROM USERFRIENDS UF1 
    WHERE UF1.idUser =1 -- this query gives my friend 
) MYFRIENDS ON 
     UF2.idUser=MYFRIENDS.idUserFriend -- get my freinds friends 
     AND UF2.idUserFriend NOT IN 
      (
       SELECT idUserFriend 
       FROM USERFRIENDS UF1 
       WHERE UF1.idUser =1   
      ) 

的優點與此查詢的第一子查詢是加入的一部分,對每條記錄將不被執行。

不幸的是,您需要在NOT IN情況下使用子查詢。

+0

這個給我所有朋友的朋友。即使是我已經成爲朋友的那些人。所以這不是我正在尋找的。 我只需要得到不是我朋友的朋友的朋友。 – Alvaro

+0

更新了我的答案。 – Kshitij