2012-07-05 112 views
7

我有一張用來保存用戶註釋的表,我想檢索每個用戶所做的最後一條評論。下面從多對多的數據庫關係中獲取數據

查詢應該給ü的什麼,我試圖做

select comment, comment_id, userId FROM comments_table 
WHERE comment_id in (
    SELECT MAX(comment_id) 
    FROM comments_table where userId in (2001, 2002, 2010) 
    GROUP BY userId 
) 

上面的查詢工作的想法,但時間過長,特別是如果有很多的用戶id需要。

我需要一個更快的查詢語句來完成同樣的事情。

回答

9

使用JOIN,而不是一個子查詢:

SELECT 
    b.* 
FROM 
    (
     SELECT userid, MAX(comment_id) AS maxcomment 
     FROM comments_table 
     WHERE userid IN (2001, 2002, 2010) 
     GROUP BY userid 
    ) a 
INNER JOIN 
    comments_table b ON 
     a.userid = b.userid AND 
     a.maxcomment = b.comment_id 

子選擇在此查詢將只執行一次,而不是一個子查詢WHERE IN將在意見表的每一行執行。

+0

將查詢時間從1秒減少到0.0026。謝謝 – user1502826

+0

什麼我需要添加到上面的查詢,如果有另一個表稱爲user_details作爲你我也想提取列u.mainimage和u.fullname可能使用b.user_id = u.user_id – user1502826

+0

什麼表將'user_details'連接鏈接?評論表?用戶表? –

0

嘗試用

  select comment, comment_id, userId FROM   comments_table WHERE userId in (2001, 2002, 2010) order by comment_id desc limit 1 

試試看這個查詢等效與你 隨着對userid列的索引,這應該表現得比體面

+0

這隻會檢索一行:*來自三個用戶中的任何一個的最新評論*。 O.P.要求三位用戶中的每個***最近發表的評論意見,這意味着您必須針對每位用戶發表的評論進行分組最大化。 –

0

更多讓我們保持它的簡單:

SELECT comment, MAX(comment_id), userId 
FROM comments_table 
WHERE userId IN (2001, 2002, 2010) 
GROUP BY userId; 
+0

該解決方案將根據'userid'拉取最新的'comment_id',但'comment'字段與'comment_id'的對應關係不正確。 –