0

招待テーブルにいないユーザーの友達を取得するためにこの SQL クエリを作成しましたが、うまくいきますが、サブクエリはパフォーマンスを犠牲にするものであり、JOINS があまり得意ではないことを読みました。参加していただければ幸いです。

ここにSQLクエリがあります

SELECT friend.id,
       friend.first_name
FROM   friends AS friend
       INNER JOIN friends_users AS friendsUser
         ON ( friend.id = friendsUser.friend_id
              AND friend.id NOT IN (SELECT friend_id
                                    FROM   friends_invitations
                                    WHERE  friends_invitations.user_id = 1) )
ORDER  BY friendsUser.id ASC 

これがテーブル構造です

friends
id   first_name

friends_users
id  friend_id  user_id

friends_invitations
id  friend_id user_id

どんな助けでも本当に感謝します

4

2 に答える 2

1

サブクエリは必ずしもパフォーマンスを低下させるとは限りません。クエリでパフォーマンスの問題が発生していますか? とにかく、ほとんどの場合、クエリを実行する最速の方法は次を使用することNOT EXISTSです:

SELECT  friend.id, 
        friend.first_name 
FROM friends AS friend 
INNER JOIN friends_users AS friendsUser 
    ON friend.id = friendsUser.friend_id  
WHERE NOT EXISTS (SELECT 1 FROM friends_invitations 
                  WHERE friends_invitations.user_id = 1
                  AND friend_id = friend.id)
ORDER BY friendsUser.id ASC

と(SQL Server の場合)の違いを説明するNOT INリンクを次に示します。したがって、このさまざまなオプションをテストして、テーブルに適したものを選択してください。LEFT JOINNOT EXISTS

于 2013-02-27T14:12:00.600 に答える
0

あなたはLEFT JOINこれに使用することができます、

SELECT  friend.id,
        friend.first_name
FROM    friends AS friend
        INNER JOIN friends_users AS friendsUser
            ON friend.id = friendsUser.friend_id 
        LEFT JOIN   friends_invitations
            ON friend.id = friends_invitations.friend_id AND
                friends_invitations.user_id = 1
WHERE   friends_invitations.friend_id IS NULL
ORDER   BY friendsUser.id ASC
于 2013-02-27T14:04:48.757 に答える