mysql - 为由多列组成的每个组选择最大版本号

标签 mysql sql group-by max

我有以下表格:

应用

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_IDBUILD_IDCONFIG_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 应用于 majorminorpatch 组合。

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/

相关文章:

Mysql 触发器 - 复合语句

php - MYSQL JSON - 如何访问由数字键索引的嵌套 JSON 对象?

javascript - 依赖下拉列表生成

mysql ->= OR <= 组合会触发全表扫描吗?

sql - 如何计算和存储网站的选票?

java - prepareStatement() 和 preparedStatement() 行为之间的区别

mysql - 将不同的列分组为一行

mysql - 将两行合二为一 - Mysql

mysql - 如何对字符串的最大值进行分组,同时保留字符串而不是其字符数?

MySQL GROUP BY 和 HAVING