2010-09-27 70 views
1

我有一個表設置像這樣(簡體爲例):幫助MySQL查詢是基於點擊次數上的項目

user_id 
item_id 
click_dt 

每個ITEM_ID有許多USER_ID的。基本上它存儲與user_id關聯的項目的點擊。

我想通過這個查詢並根據click_dt列出每個item_id的最新user_id。

所以,如果有5個點擊次數ITEM_ID 55,最後點擊或click_dt DESC將顯示記錄....

有意義嗎?任何幫助將是可怕的...謝謝!

回答

1

用途:

SELECT x.* 
    FROM YOUR_TABLE x 
    JOIN (SELECT t.item_id, 
       MAX(t.click_dt) AS max_date 
      FROM YOUR_TABLE t 
     GROUP BY t.item_id) y ON y.item_id = x.item_id 
          AND y.max_date = x.clicked_dt 

備選:

SELECT x.item_id, 
     x.user_id, 
     x.click_dt 
    FROM (SELECT t.item_id, 
       t.user_id, 
       t.click_dt, 
       CASE 
       WHEN @item = t.item_id THEN @rownum := @rownum + 1 
       ELSE @rownum := 1 
       END AS rk, 
       @item := t.item_id 
     FROM YOUR_TABLE t 
     JOIN (SELECT @rownum := 0, @item := 0) r 
    ORDER BY t.itemid, click_dt DESC) x 
WHERE x.rk = 1 
+0

你如何格式化你的查詢?還是他們手寫得如此性感? – zerkms 2010-09-27 01:16:44

+0

哇!非常感謝,從來不會想到那些......都可以工作,但Alternate似乎快了一倍。我不得不在sub select中爲用戶表添加一個連接...它比我以前的版本快8倍(這甚至沒有返回正確的結果!) – dzm 2010-09-27 01:19:40

0

試試這個:

SELECT user_id,item_id,click_dt FROM 
(
    SELECT MAX(click_dt) AS LastClick_dt,item_id FROM aTable 
    GROUP BY item_id 
) As LastClick 
INNER JOIN aTable 
ON aTable.itemid = LastClick.item_id 
AND aTable.click_dt = LastClick.LastClick_dt 

子選擇部分將給予最新點擊每個ITEM_ID,然後你就可以加入這個到原始表來檢索匹配的user_id。