2016-08-04 146 views
0

我有一個用戶觀看歷史記錄表。每次查看內容時,我都會記錄'content_id','user_id'並在名爲'watch_history'的表中添加時間戳。即使連續多次觀看同一內容,也會記錄每次點擊。MySQL分組排序問題

我需要提取觀看歷史記錄,但'content_id'列應該是截然不同的,並且按照最近觀看的順序排列......我發現很難解釋,但基本上確切地說YouTube觀看歷史記錄作品(沒有同一個視頻的多個實例)。

這是我到目前爲止有:

SELECT content_id, time_stamp, user_id, 
    COUNT(DISTINCT content_id) AS hit_count 
FROM watch_history 
WHERE user_id = X 
GROUP BY content_id 
ORDER BY time_stamp DESC 

它的工作原理,但我需要的「TIME-STAMP」字段,以反映上一次內容的觀看,任何幫助嗎?

謝謝。

+1

'SELECT x,COUNT(DISTINCT x)... GROUP BY x'將始終產生1的計數。你想要'MAX(time_stamp)'。 _注意user_id最有可能不是具有上次time_stamp值的記錄的user_id ._ – Uueerdo

+0

嘗試最新的 –

+0

@Uueerdo的max(time_stamp)。 。 。註釋中的「註釋」不是真的,因爲where子句只選擇一個用戶標識。 –

回答

3

你必須在SELECT不在的GROUP BY列。對於user_id這是可以接受的,因爲它是一個固定值。但對於timestamp這並不好。

使用MAX()聚合函數:

SELECT content_id, MAX(time_stamp) as time_stamp, user_id, 
     COUNT(*) AS hit_count 
FROM watch_history 
WHERE user_id = X 
GROUP BY content_id, user_id 
ORDER BY MAX(time_stamp) DESC; 

注:COUNT(DISTINCT content_id)沒有意義。它會在每行返回「1」(除非有一行,其中content_idNULL)。我想你只想要COUNT(*)

+0

即使按content_id和user_id進行分組,而不是按時間戳進行分組,這不會僅顯示每個contentId和UserId一行,(每個用戶對每個內容的最新Hit),並且不包括所有匹配? –

+1

這工作完美。謝謝 :) – user2597933

0

要按最近的內容視圖或特定查看器最近瀏覽的內容排序嗎?

如果答案是前者,那麼:

SELECT content_id, user_id, 
    COUNT(content_id) AS hit_count 
FROM watch_history h 
WHERE user_id = X 
GROUP BY content_id 
ORDER BY (Select Max(timestamp) from watch_history 
      Where user_id = X 
      and content_id = h.content_id) DESC 

SELECT content_id, time_stamp, user_id, 
    COUNT(content_id) AS hit_count 
FROM watch_history h 
    join watch_history last 
     on last.content_id = h.Content_id 
      and last.timestamp = 
       (Select max(timestamp) FROM watch_history 
       where user_id = X 
        and content_id = h.content_id) 
WHERE user_id = X 
GROUP BY content_id, time_stamp 
ORDER BY last.timestamp desc