多表关联查询:获取每条用户记录的最新采购设备数据
解决方案:获取每个用户最新购买的设备记录
首先假设你的用户表名为users,设备表名为devices(如果实际表名不同,替换成你的表名即可)。要实现需求,我们可以通过两种常见方式搭配INNER JOIN来完成,确保只保留有设备关联的用户,同时精准筛选出每个用户的最新设备记录。
方法一:使用ROW_NUMBER()窗口函数(推荐)
这种方法逻辑清晰,还能灵活处理同一用户同一天购买多台设备的场景——如果需要唯一结果,行号会确保只取一条;若想保留所有同一天的记录,可改用RANK()替代ROW_NUMBER()。
SELECT u.id, u.name, d.device_id, d.devicename AS device_name FROM users u INNER JOIN ( SELECT device_id, id, devicename, purchasedate, -- 按用户id分组,购买日期降序排序,最新的记录行号标记为1 ROW_NUMBER() OVER (PARTITION BY id ORDER BY purchasedate DESC) AS rn FROM devices ) d ON u.id = d.id WHERE d.rn = 1;
方法二:子查询获取最大购买日期(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如早期版本的MySQL),可以用这种方式:先找出每个用户的最新购买日期,再关联设备表和用户表筛选对应记录。
SELECT u.id, u.name, d.device_id, d.devicename AS device_name FROM users u INNER JOIN devices d ON u.id = d.id INNER JOIN ( SELECT id, MAX(purchasedate) AS latest_date FROM devices GROUP BY id ) max_d ON d.id = max_d.id AND d.purchasedate = max_d.latest_date;
最终结果
两种方法都会返回你预期的结果:
| id | name | device_id | device_name |
|---|---|---|---|
| 1 | john | 3 | iphone3 |
| 2 | doe | 5 | iphone5 |
| 3 | jan | 6 | iphone6 |
注意:如果某个用户在同一天购买了多台设备,方法二会返回多条该用户的记录,而方法一默认只返回一条,你可以根据实际需求调整。
内容的提问来源于stack exchange,提问作者vamsi shankar
相关产品推荐
相关产品推荐

