2012-06-21 141 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