【问题标题】:MySQL Grouping sort issueMySQL分组排序问题
【发布时间】:2016-12-11 04:02:49
【问题描述】:

我有一张用户观看历史记录表。每次查看内容时,我都会记录“content_id”、“user_id”并在名为“watch_history”的表中添加一个时间戳。即使连续多次观看相同的内容,也会记录每次点击。

我需要提取观看历史记录,但“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”字段来反映上次观看该内容的时间,有什么帮助吗?

谢谢。

【问题讨论】:

  • SELECT x, COUNT(DISTINCT x) ... GROUP BY x 将始终为计数产生 1。你想要MAX(time_stamp)请注意,user_id 很可能不是具有最后一个 time_stamp 值的记录的 user_id。
  • 尝试 max(time_stamp) 获取最新的
  • @Uueerdo 。 . .您评论中的note 不正确,因为where 子句仅选择一个用户ID。
  • @GordonLinoff 哦,你是对的,我忽略了这一点。

标签: mysql database sorting grouping


【解决方案1】:

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(*)

【讨论】:

  • 因为您是按 content_id 和 user_id 分组,而不是按时间戳分组,这不是每个 contentId 和 UserId 只显示一行(对于每个用户对每个内容的最新命中),并且不包括所有命中?
【解决方案2】:

您希望点击按内容的最新视图排序,还是按特定查看者对内容的最新视图排序?

如果答案是前者,那么:

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

【讨论】:

    猜你喜欢
    • 2010-09-26
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2020-05-16
    相关资源
    最近更新 更多