Select 所有 id 列表中的所有最后日期

Select all the last dates from all list of id

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

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

我正在尝试运行以下查询

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

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

如您所见,我设法让视频显示时没有 id_video_tipo 重复,但我无法显示最新日期的视频。例如,对于 id_video_tipo = 6,它应该显示 id = 3 的视频。相反,它显示 id = 2 的视频。我该如何修复它?

您将需要使用 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 及更高版本。

您可以使用 WHERE 子句中的相关子查询来实现,其中 returns 每个 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
)

相关子查询是正确的方法。但是,如果你想保证每个 id_video_tipo 的结果集中有 one 行——你的问题 explicitly 指出——那么你需要小心。源数据中的重复项导致结果集中的重复项。

解决这个问题的方法是使用 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 所建议的那样。