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

时间:2015-05-27 09:26:47

标签: mysql sql query-optimization

我有3个表格,结构如下。

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

用户可以进行喜欢或评论等活动。他还可以订阅许多用户。现在我想基于活动类型为他建议一些用户并避免他当前的订阅用户。

假设用户“A”的id = 1 =>我想向大多数活跃用户(有很多活动的用户)建议15个用户使用“A”,并避免当前订阅用户“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 in not not in”。但我找不到最好的解决方案。

感谢您分享更好的查询以解决此问题。

1 个答案:

答案 0 :(得分:0)

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