我遇到了一个使我疯狂的问题,希望你们中的某人可以帮助我。
我有一张桌子,我在这里存储一些youtube上的视频。现在,对于我通过youtube API 20视频存储的每个频道。因此,如果我有6个频道,我将有120个视频。每个视频都有一种“时间戳”。 我需要从该表中提取每个频道按publishedAt字段排序的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]
答案 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;