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

标签 mysql

我正在制作一个用户可以互相关注的 SNS。如果用户 A 关注用户 B 并且用户 B 也关注用户 A,则他们成为 friend

还要考虑到一些受欢迎的人(例如电影明星)可能会被关注数十万次,但用户最多可以关注 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)
);

最佳答案

假设“最佳”指的是表现最好的,并且考虑到以下人员必须是相互的才能满足您的“ friend ”标准:

使用 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

(尽管请注意,像 MSSQL 这样的 RDBMS 将默认使用主键作为聚集索引,在这种情况下,它确实有很多内容。)

关于mysql - 具有相互用户关系的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11072526/

相关文章:

MySql - 从 2 个表中选择 *,但在结果集中添加表名前缀?

mysql - MULTI DELETE 中的未知表

php - 将 Sphinx 与 PHP 和 MySQL 一起使用的指南

mysql - MySQL中的 "active"语句是什么?

mysql - 在 Laravel 查询生成器中使用括号

php - 为什么我的 PHP 代码在运行时返回空白页?

MySQL 无法在 AMPPS OS X 上启动

php - 从 URL 字符串传递多个变量

MySQL 同一列在 2 个不同日期之间的最大差异

mysql - 在 Rails 中限制字符串属性的大小是否会使数据库变得更小?