我有以下表格:
应用
TYPE_ID | BUILD_ID | CONFIG_ID | VERSION_ID | (All foreign keys to the respective tables)
1 | 1 | 1 | 1 |
1 | 1 | 1 | 2 |
2 | 2 | 3 | 3 |
2 | 2 | 3 | 4 |
版本
ID | major | minor | patch
1 | 1 |0 |1
2 | 2 |0 |0
3 | 3 |0 |3
4 | 4 |0 |0
我需要从 Apps
表中为 TYPE_ID
、BUILD_ID
和 CONFIG_ID
的每个唯一组合选择最高版本行>。
版本号应该由versions表中的MAX(major * 1000000 + minor * 1000 + patch)
计算
因此,根据给定的 Apps
表示例,结果将是:
TYPE_ID | BUILD_ID | CONFIG_ID | VERSION_ID |
1 | 1 | 1 | 2 |
2 | 2 | 3 | 4 |
尝试过这样的事情:
SELECT p1.* FROM Apps p1
INNER JOIN (
SELECT max(VERSION_ID) MaxVersion, CONFIG_ID
FROM Apps
GROUP BY CONFIG_ID
) p2
ON p1.CONFIG_ID = p2.CONFIG_ID
AND p1.VERSION_ID = p2.MaxVersion
GROUP BY `TYPE_ID`, `BUILD_ID`, `CONFIG_ID`
但是 MAX
应用于 VERSION_ID
,我需要 MAX
应用于 major
,minor
和 patch
组合。
MySQL Version 15.1 distribution 5.5.56-MariaDB
如有任何帮助,我们将不胜感激。
干杯!
最佳答案
您可以使用问题中描述的公式计算每个 type_id、build_id、config_id
的最大版本,再次使用相同的公式来定位版本:
SELECT sq.type_id, sq.build_id, sq.config_id, versions.id AS version_id_max
FROM (
SELECT type_id, build_id, config_id, MAX(major * 1000000 + minor * 1000 + patch) AS max_version
FROM apps
INNER JOIN versions ON apps.version_id = versions.id
GROUP BY type_id, build_id, config_id
) sq
INNER JOIN versions ON max_version = major * 1000000 + minor * 1000 + patch
+---------+----------+-----------+----------------+
| type_id | build_id | config_id | version_id_max |
+---------+----------+-----------+----------------+
| 1 | 1 | 1 | 2 |
| 2 | 2 | 3 | 4 |
+---------+----------+-----------+----------------+
关于mysql - 为由多列组成的每个组选择最大版本号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52332457/