我正在尝试选择最后插入的所有视频,而不重复任何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的视频。
答案 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建议的那样。