Mysql SQL联接和子查询,子查询到SQL联接

Mysql SQL联接和子查询,子查询到SQL联接,mysql,sql,performance,join,subquery,Mysql,Sql,Performance,Join,Subquery,我编写此SQL查询是为了获得不在邀请表中的用户的朋友,它会起作用,但是我了解到子查询是性能食客,并且我不太擅长连接,如果您能帮助我将此查询修改为仅在连接中,我将不胜感激 这是SQL查询 SELECT friend.id, friend.first_name FROM friends AS friend INNER JOIN friends_users AS friendsUser ON ( friend.id = friendsUser.frie

我编写此SQL查询是为了获得不在邀请表中的用户的朋友,它会起作用,但是我了解到子查询是性能食客,并且我不太擅长连接,如果您能帮助我将此查询修改为仅在连接中,我将不胜感激

这是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
以下是表格结构

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

非常感谢您提供的任何帮助

您可以使用
左加入
来实现此目的

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

子查询不一定是性能食客,您的查询是否表示性能问题?。无论如何,大多数情况下,执行查询的最快方法是使用
不存在的

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)之间的区别。因此,请测试不同的选项,并为您的表选择正确的选项。

如果您对性能有疑问,您也应该标记您正在使用的RDBMS(例如Oracle、SQL Server、MySQL)。SQL是声明性的。它的优化方式取决于您使用的产品。联接不一定可以重新编写为子选择。如果一个数据库管理系统有一个合适的优化器,它会自动这样做,如果它认为它能提高性能的话。@horse\u有一个我正在使用的MySQL名称,它会这样做吗?不,MySQL中的优化器是非常愚蠢的-特别是对于sub-select,如果你在搜索发生的列上正确定义了一个索引,那么你就不用担心了。下面是一些链接中的一条语句:
LEFT-JOIN/IS-NULL和NOT-EXISTS在语义上是等价的,而NOT-IN-IS-NOT是等价的。
它与您的预期结果有何不同?