[英]Performance for select friends of friends sql (but not my friends)
我想得到不是我朋友的朋友的朋友。 我有一個這樣的表:userFriends(idUser,idUserFriend)
我在想這樣的事情:
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)
但是我不確定它是否如此緩慢或是否可以以其他方式更快。
有什么看法嗎?
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
;
還有“ EXCEPT”版本:
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
)
;
使用聯接進行比較:
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)。
有關JOIN與子查詢的更多信息
select myFriend.idUserFriend from userFriend me inner join userFriends myFriend
on me.idUserFriend = myFriend.idUser and myFriend.idUserFriend != me.idUserFriend
where me.idUser='MyUserId';
嘗試這個 -
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情況使用子查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.