从所有ID列表中选择所有最后日期

时间:2020-04-05 10:23:35

标签: mysql sql greatest-n-per-group

我正在尝试选择最后插入的所有视频,而不重复任何ID_video_type(id_video_tipo列)。

这是数据库中数据的示例:

enter image description here

我正在尝试运行以下查询

SELECT *
FROM `video` 
GROUP BY id_video_tipo
ORDER BY data DESC

但是当我这样做时,我得到了以下结果

enter image description here

如您所见,我设法使视频得以显示而无需重复id_video_tipo,但是我却无法获得具有最新日期的视频。例如,对于id_video_tipo = 6,它应该显示id为3的视频。相反,它应该显示id为2的视频。

3 个答案:

答案 0 :(得分:1)

您将需要使用WINDOW function来执行此操作:

CREATE TABLE video
(
id_video_tipo INT,
data DATETIME
);

INSERT INTO video VALUES (1,'2020-01-01'),(1,'2020-01-02'),(1,'2020-01-03'),(1,'2020-01-04');

SELECT *
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY id_video_tipo ORDER BY data DESC) AS 'RNum'
    FROM `video` 
) vids
WHERE vids.RNum = 1;

以上内容明确适用于MySQL 8及更高版本。

答案 1 :(得分:0)

您可以在WHERE子句中使用相关子查询来执行此操作,该子查询返回每个id_video_tipo的最后日期:

SELECT v.*
FROM `video` v
WHERE v.data = (SELECT MAX(data) FROM `video` WHERE id_video_tipo = v.id_video_tipo)

或使用NOT EXISTS

SELECT v.*
FROM `video` v
WHERE NOT EXISTS (
  SELECT 1 FROM `video`
  WHERE id_video_tipo = v.id_video_tipo AND data > v.data
)

答案 2 :(得分:0)

相关子查询是正确的方法。但是,如果您想保证每个id_video_tipo的结果集中的一行行-您的问题明确指出-那么您需要小心。源数据重复,结果集中重复。

解决方案是使用id列:

SELECT v.*
FROM video v
WHERE v.id = (SELECT v2.id
              FROM video v2
              WHERE v2.id_video_tipo = v.id_video_tipo
              ORDER BY v2.data DESC
              LIMIT 1
             );

在MySQL 8+中,您将使用row_number(),如Jim Jonson建议的那样。