具有相互用户关系的SQL查询

时间:2012-06-17 15:32:21

标签: mysql

我正在创建一个用户可以互相关注的SNS。如果用户A跟随用户B而用户B也跟随用户A,则他们变为朋友

还要考虑一些受欢迎的人(如电影明星)可能会跟随数十万次,但用户最多可以跟踪1000人。

因此,根据下表,获取用户1的所有朋友ID的最佳SQL查询是什么?

PS:我正在使用MySQL 5.5。

这是我到目前为止所做的:

SELECT followee_id AS friend_id FROM follow
    WHERE follower_id = 1 AND
        followee_id IN (SELECT follower_id FROM follow
                            WHERE followee_id = 1);


CREATE TABLE follow
(
    follower_id     INT UNSIGNED NOT NULL,
    followee_id     INT UNSIGNED NOT NULL,

    PRIMARY KEY (follower_id, followee_id),

    INDEX (followee_id, follower_id)
);

1 个答案:

答案 0 :(得分:2)

假设“最好”的意思是最有效的,并且考虑到以下必须是相互的,以满足您的“朋友”标准:

使用followee_id的过滤器会比follower_id上的过滤器更好地命中您的索引

select 
    me.follower_id
from 
    follow me inner join 
    follow you 
  on 
      me.follower_id = you.followee_id
      and me.followee_id = you.follower_id
where 
    me.followee_id = @user

(虽然请注意,RDBMS就像MSSQL一样,默认使用你的主键作为聚集索引,在这种情况下它真的很多。)