如何选择按日期DESC和MySQL中的字段分组的最后两个记录?

时间:2019-07-11 20:38:55

标签: mysql sql

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

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

有人可以帮助我吗? SQL:版本5.5.60-MariaDB-Mysql 谢谢您的帮助

enter image description here

这是我很长一段时间尝试的

          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]

this is the actually query result

2 个答案:

答案 0 :(得分:0)

尝试以下查询。子查询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;

答案 1 :(得分:0)

您可以更简单地执行此操作:

SELECT vfy.publishedAt, vfy.channelId, vfy.channeltitle
FROM video_from_youtube vfy
WHERE vfy.id >= (SELECT vfy2.id
                 FROM video_from_youtube vfy
                 WHERE vfy2.channelId = vfy.channelId
                 ORDER BY vfy2.id DESC
                 LIMIT 1, 1  -- get the second
                )
ORDER BY publishedAt DESC;