2016-08-04 21 views
0

私は、ユーザーの視聴履歴を持っています。私は 'content_id'、 'user_id'を記録し、コンテンツを見るたびに 'watch_history'というテーブルにタイムスタンプを追加します。同じコンテンツが連続して複数回視聴されても、すべてのヒットが記録されます。MySQLグループ化ソートの問題

私は鑑賞履歴を抽出する必要がありますが、 'content_id'列は別のものにして、最近視聴した順番に並べる必要があります...私は説明が難しいと思っていますが、作品(同じビデオの複数のインスタンスはありません)。

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

最新のものについてはmax(time_stamp)を試してください –

+0

@Uueerdo。 。 。あなたのコメントの 'note'は真ではありません。なぜなら、' where'節は単一のユーザIDだけを選ぶからです。 –

答えて

3

あなたはGROUP BYにないSELECTの列を持っています。これは固定値なので、user_idでは許容されます。しかし、timestampのためにそれはokではありません。

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)は意味がありません

MAX()集計関数を使用します。各行に "1"が返されます(ただし、content_idNULLの行が1つない場合を除く)。あなたはちょうどCOUNT(*)がほしいと思う。

+0

あなたはcontent_idとuser_idでグループ分けしていますが、タイムスタンプではなく、contentIdとUserIdごとに1つの行しか表示されません(各ユーザーの最新のコンテンツごとに表示されます)。 –

+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