我有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”。但我找不到最好的解决方案。
感谢您分享更好的查询以解决此问题。
答案 0 :(得分:0)
我刚刚通过在这3个表中的相关字段中添加索引来解决我的问题。它从15秒到50毫秒加速了大约300次。