首页 > 解决方案 > 如何在mysql中选择按日期DESC排序并按字段分组的最后两条记录?

问题描述

我遇到了一个让我发疯的问题,我希望你们中的某个人可以帮助我。

我有一张桌子,我可以在其中存储一些来自 youtube 的视频。现在,对于我通过 youtube API 20 视频存储的每个频道。因此,如果我有 6 个频道,我将有 120 个视频。每个视频都有一种“时间戳”。我需要从这个表中提取最后两个视频,每个频道的publishAt 字段按DESC 排序。我尝试上传截图,但这不是我想要的。

有人可以帮助我吗?sql:版本5.5.60-MariaDB-Mysql 谢谢大家帮忙

在此处输入图像描述

这是我尝试了很长时间

          SELECT publishedAt, channelId, channeltitle
          FROM video_from_youtube a
          WHERE a.id
            IN (
              SELECT MAX(t.id)
              FROM video_from_youtube t
              WHERE a.channelId = t.channelId
             )
            OR
                a.id
            IN (
              SELECT MAX(t.id)
              FROM video_from_youtube t
              WHERE a.channelId = t.channelId AND 
              t.id NOT IN (
                  SELECT MAX(t2.id)
                  FROM video_from_youtube t2
                  WHERE t.channelId = t2.channelId
                )
             )       
          ORDER BY a.publishedAt DESC, a.id[enter image description here][1]

这是实际的查询结果

标签: mysqlsql

解决方案


尝试以下查询。子查询 v 是按通道和时间戳对数据进行排序。子查询 o 是为每个频道中的每个视频分配一个编号。此处需要会话变量。当频道发生变化时(@channel_id 为上一行的频道),编号从 1 开始。

SELECT o.publishedAt, o.channelId, o.channeltitle
FROM (
  SELECT v.*,
        (@video_order := CASE WHEN @channel_id = v.channelId THEN @video_order + 1 ELSE 1 END ) as row_num,
        (@channel_id := v.channelId) AS channel_id
  FROM (
    SELECT t.publishedAt, t.channelId, t.channeltitle
    FROM video_from_youtube t
    ORDER BY t.channelId, t.publishedAt DESC) v 
  ) o
WHERE o.row_num<=2;

推荐阅读