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 所建议的那样。
我正在尝试 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 所建议的那样。