2015-05-27 41 views
0

我有3個表,結構如下。查詢建議用戶尚未訂閱的前15名最活躍用戶

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

用戶可以做像like或comment這樣的活動。他也可以訂閱許多用戶。現在我想根據活動類型爲他建議一些用戶,並避免他目前的訂閱用戶。

假設用戶「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 and not in」。但我找不到最好的解決方案。

欣賞你的分享關於更好的查詢來解決這個問題。

+0

如果您願意,請考慮遵循以下簡單的兩步操作步驟:1.如果您尚未這樣做(您沒有),請提供適當的DDL(和/或sqlfiddle),以便我們可以更輕鬆地複製問題。 2.如果您還沒有這樣做(再次沒有),請提供與步驟1中提供的信息相對應的所需結果集。 – Strawberry

回答

0

我剛剛解決了我的問題,將索引添加到這3個表中的相關字段。它從15秒到50毫秒加速300次左右。