查询以建议用户尚未订阅的前 15 个最活跃的用户

Query to suggest top 15 most active users who are not yet subscribed by user

我有 3 个表,结构如下。

 tbl_activities (id, activity_type, user_id)
 tbl_subscriptions (id, subscriber_id, subscribed_id)
 tbl_users (id, user_name)

用户可以activity喜欢或评论。他还可以订阅许多用户。现在我想根据 activity 类型为他推荐一些用户并避免他当前的订阅用户。

假设用户 "A" 的 id=1 => 我想由最活跃的用户(有很多活动的用户)向用户 "A" 推荐 15 个用户,并避免用户 "A".

的当前订阅用户

我使用了这个查询,但大约需要 15 秒才能完成。

SELECT id, user_name FROM tbl_users 
WHERE id IN (
   SELECT t.user_id FROM (
      SELECT act.user_id 
      FROM tbl_activities act 
      INNER JOIN tbl_users u 
      ON act.user_id=u.id 
      WHERE u.id NOT IN (
         SELECT s.subscribed_uid 
         FROM tbl_subscriptions s 
         INNER JOIN tbl_users u1 
         ON s.subscribed_uid=u1.id 
         WHERE s.subscriber_id=1
      ) 
      GROUP BY act.user_id 
      ORDER BY COUNT(act.user_id) 
      DESC LIMIT 0,15
    ) AS t
)

我知道它很慢,因为查询 "in and not in"。但是我找不到最好的解决方案。

感谢您分享更好的查询来解决这个问题。

我刚刚通过为这 3 个表中的相关字段添加索引解决了我的问题。它从 15 秒加速到 50 毫秒大约 300 倍。