Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从id的所有列表中选择所有最后日期_Mysql_Sql_Greatest N Per Group - Fatal编程技术网

Mysql 从id的所有列表中选择所有最后日期

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,它应该显示

我正在尝试选择上次插入的所有视频,而不重复任何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,它应该显示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
             );