2010-09-27 2 views
1

У меня есть настройки таблицы, как это (упрощенный), например:Помощь с запросом MySQL, который основан на количестве кликов по пункту

user_id 
item_id 
click_dt 

Каждый item_id имеет много user_id х. В основном это хранение кликов по элементам, связанным с user_id.

Я хочу запросить это и перечислить только последние user_id для каждого item_id, на основе click_dt.

Так что, если есть 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 

Alternate:

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

+0

ничего себе! Большое спасибо, никогда бы не придумали эти ... оба работают, но Alternate, кажется, примерно в два раза быстрее. Я должен был добавить в join также для таблицы users в sub select ... это в 8 раз быстрее, чем у меня ранее (что даже не вернуло правильные результаты!) – dzm

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.