Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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 从sql数据库中选择不同语言的条目的最后版本_Mysql_Sql_Database - Fatal编程技术网

Mysql 从sql数据库中选择不同语言的条目的最后版本

Mysql 从sql数据库中选择不同语言的条目的最后版本,mysql,sql,database,Mysql,Sql,Database,有没有办法在一个sql查询中实现这一点?我想得到每种语言的同一条目的最新版本 我的表格和示例数据如下: ID | Index | Version | Language | ... ------------------------------------------------ 1 1 1 1 test1 2 1 2 1 test2 3

有没有办法在一个sql查询中实现这一点?我想得到每种语言的同一条目的最新版本

我的表格和示例数据如下:

ID  |  Index  |  Version  |  Language  | ...
------------------------------------------------
1        1          1            1         test1
2        1          2            1         test2
3        2          1            1         test3
4        2          1            2         test4
5        2          1            3         test5
6        2          2            3         test6
7        3          1            1         test7
8        3          1            2         test8
ID是唯一的标识符 索引对于数据库中的任何条目都是唯一的,这意味着同一文章/条目的所有时间版本和语言版本共享相同的索引。 版本显然是版本号。1是第一个版本,任何较大的数字通常都是较新的。 Language是条目/文章的语言版本号。 我真的想不出在一个查询中得到这个结果的方法。但也许这是可行的

我想得到这样的东西:

ID  |  Index  |  Version  |  Language  | ...
------------------------------------------------
2        1          2            1         test2
3        2          1            1         test3
4        2          1            2         test4
6        2          2            3         test6
7        3          1            1         test7
8        3          1            2         test8
test1退出,因为test2使用相同的语言,而且更新 test5已退出,因为test6在同一语言中较新

断然的 编辑:我假设ID在增加,最新的是最后一个

也许可以试试这个:

SELECT T1.ID, T1.Index, T1.Version, T1.Language FROM Table T1 
LEFT JOIN Table T2 ON (T1.Version < T2.Version AND T1.Language = T2.Language)
 WHERE T2.ID IS NULL
那怎么办 选择S.* 从…起 选择T1* 从入口视图T1 按T1订购。版本描述 s 按语言分组

请参阅其他一些标有“每组最多n个+1”的问题。避免使用聚合的好技巧。第二个似乎更合适。是的,我是这么早在这里学到的!-我相信这是一个快得多的解决方案。从这里创建视图是不可能的吗?它会很有用。@Simon:快还是不快,我更喜欢你的而不是我的。我使用第二个查询是因为我可以将它放到视图中,而我不能使用Andrey M解决方案,因为视图中没有子查询。哪一个更快?内部连接还是左连接?@Kaminari:作为一个一般性的问题,我认为它太宽泛了,无法明确回答。说到这个特殊的解决方案,问题不在于哪个更快,而在于哪个能带来正确的结果。在这种情况下,LEFT JOIN将返回表中的所有行,据我所知,这不是您所需要的。我正在尝试创建视图以缩短查询。大多数情况下,我只需要文章的最新版本,但似乎无法在视图中使用JOIN:@Kaminari:我的解决方案中的子查询返回每个索引项的每个翻译的最后版本号。你可以把它当作一个视图。当然,如果它返回完整的行以及ID和文本部分会更好。尽管如此,它还是允许您在一定程度上缩短查询。
    SELECT T1.ID, T1.Index, T1.Version, T1.Language FROM Table T1 
LEFT JOIN Table T2 ON (T1.ID < T2.ID AND T1.Language = T2.Language) 
WHERE T2.ID IS NULL
SELECT T1.ID, T1.Index, T1.Version, T1.Language FROM Table T1 
LEFT JOIN Table T2 ON (T1.Version < T2.Version AND T1.Language = T2.Language)
 WHERE T2.ID IS NULL
SELECT t.*
FROM atable t
  INNER JOIN (
    SELECT
      Index,
      MAX(Version) AS MaxVersion,
      Language
    FROM atable
    GROUP BY Index, Language    
  ) max ON t.Index = max.Index AND t.Version = max.MaxVersion
    AND t.Language = max.Language