如何编写SQL查询关联表,获取当前版本为1.3的用户
首先我们先明确两张表的结构与示例数据:
用户数据表(记录用户的版本变更历史,Id自增,数值越大代表记录越新)
| Id | Name | VersionId |
|---|---|---|
| 1 | Name A | 1 |
| 2 | Name B | 2 |
| 3 | Name C | 1 |
| 4 | Name A | 2 |
| 5 | Name E | 1 |
| 6 | Name F | 3 |
| 7 | Name G | 2 |
| 8 | Name C | 4 |
| 9 | Name A | 5 |
版本配置表
| Id | Version |
|---|---|
| 1 | 1.2 |
| 2 | 1.3 |
| 3 | 1.4 |
| 4 | 1.5 |
| 5 | 1.6 |
实现逻辑
用户每次切换版本都会在用户数据表新增一条记录,因此每个用户(按Name字段分组)对应的最大Id的记录就是用户当前正在使用的版本,只需筛选出这些最新记录中版本号为1.3的条目即可。
查询语句
通用子查询写法(兼容所有主流数据库)
SELECT u.* FROM user_version_records u JOIN version_config v ON u.VersionId = v.Id WHERE u.Id = ( SELECT MAX(Id) FROM user_version_records WHERE Name = u.Name ) AND v.Version = '1.3';
窗口函数写法(适用于MySQL8.0+、PostgreSQL、SQL Server等支持窗口函数的数据库)
WITH latest_user_records AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Id DESC) AS rn FROM user_version_records ) SELECT l.Id, l.Name, l.VersionId FROM latest_user_records l JOIN version_config v ON l.VersionId = v.Id WHERE l.rn = 1 AND v.Version = '1.3';
返回结果
| Id | Name | VersionId |
|---|---|---|
| 2 | Name B | 2 |
| 7 | Name G | 2 |
内容的提问来源于stack exchange,提问作者Rafa
相关产品推荐
相关产品推荐

