Mysql 从id的所有列表中选择所有最后日期
我正在尝试选择上次插入的所有视频,而不重复任何ID\u video\u type ID\u video\u tipo列 以下是数据库中的数据示例: 我正在尝试运行以下查询Mysql 从id的所有列表中选择所有最后日期,mysql,sql,greatest-n-per-group,Mysql,Sql,Greatest N Per Group,我正在尝试选择上次插入的所有视频,而不重复任何ID\u video\u type ID\u video\u tipo列 以下是数据库中的数据示例: 我正在尝试运行以下查询 SELECT * FROM `video` GROUP BY id_video_tipo ORDER BY data DESC 但当我这样做时,我得到了以下结果 正如你所看到的,我设法让视频在没有重复id_video_tipo的情况下显示,但我无法获得显示最新日期的视频。例如,对于id_video_tipo=6,它应该显示
SELECT *
FROM `video`
GROUP BY id_video_tipo
ORDER BY data DESC
但当我这样做时,我得到了以下结果
正如你所看到的,我设法让视频在没有重复id_video_tipo的情况下显示,但我无法获得显示最新日期的视频。例如,对于id_video_tipo=6,它应该显示id=3的视频。相反,它显示id为2的视频。如何修复它?您需要使用a来执行此操作:
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子句中的相关子查询来完成,该子查询返回每个id\u video\u tipo的最后日期: 或不存在:
相关子查询是正确的方法。但是,如果您想保证每个id\u video\u tipo的结果集中有一行(您的问题明确说明了这一点),那么您需要小心。源数据中存在重复项,结果集中存在重复项 解决方法是使用id列:
在MySQL 8+中,正如Jim Jonson所建议的那样,您可以使用行号来实现此目的。不起作用。。。。Comando SQL:Documentação SELECT*FROM SELECT*,按id_video_tipo顺序按数据描述的分区上的行数作为视频视频中的“RNum”,其中vids.RNum=1限制0,25 Mensagens do MySQL:Documentação 1064-Vocêtem um erro de sintaxe no seu SQL próximo a“按id分区视频顺序按数据描述”从视频“na linha 4您使用的是什么版本的MySQL?@user13227454。如果多行具有相同的视频类型和相同的上次插入时间,该怎么办。您应该将子查询限制为返回多行。@Yogeshharma。叹气非常感谢。
SELECT v.*
FROM `video` v
WHERE v.data = (SELECT MAX(data) FROM `video` WHERE id_video_tipo = v.id_video_tipo)
SELECT v.*
FROM `video` v
WHERE NOT EXISTS (
SELECT 1 FROM `video`
WHERE id_video_tipo = v.id_video_tipo AND data > v.data
)
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
);