查询以建议用户尚未订阅的前 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 倍。
我有 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 倍。