1

友達ではない友達の友達を作りたいです。私はこのようなテーブルを持っています: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)

しかし、それがとても遅いのか、それとも別の方法でもっと速くなるのかはわかりません。

これについて何か意見はありますか?

4

4 に答える 4

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
        ;

そして、「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
        )
        ;
于 2012-06-21T11:27:29.020 に答える
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 の場合にはサブクエリを使用する必要があります。

于 2012-06-21T11:26:00.923 に答える
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比較のために関連フィールドのインデックスを使用するため、サブクエリよりも s を使用することをお勧めします。一方、サブクエリは、相関関係のないサブクエリ (MySQL) であっても、返される行ごとに実行されます。

JOIN とサブクエリの詳細

于 2012-06-21T11:11:45.227 に答える
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';
于 2012-06-21T11:12:02.840 に答える