MySQL多对一关联查询:获取项目对应最新projectInfo记录
问题根因
你的现有SQL存在两个问题:
- SELECT子句仅查询了别名
p(即projectInfo表)的字段,没有查询别名a(即projects表)的字段,自然无法返回creatorId、timestamp、projectType等projects表的字段 - 别名语义混乱,容易写错关联逻辑
正确SQL方案
全MySQL版本兼容方案
该方案支持所有MySQL版本,逻辑和你原有写法接近,只需要调整SELECT字段范围即可:
SELECT a.id, a.timestamp, a.projectType, a.creatorId, p.updatedTimestamp, p.projectName, p.projectDescription, p.userId FROM projects AS a JOIN projectInfo AS p ON p.id = ( SELECT pi.id FROM projectInfo AS pi WHERE pi.projectId = a.id ORDER BY pi.updatedTimestamp DESC LIMIT 1 );
注意:如果存在项目创建后尚未生成任何projectInfo记录的边界场景,将
JOIN替换为LEFT JOIN,即可保证projects表的所有记录都不会被过滤掉。
MySQL 8.0+ 高性能方案
如果你使用的是MySQL 8.0及以上版本,推荐用窗口函数实现,数据量较大时查询性能远高于关联子查询写法:
WITH ranked_info AS ( SELECT projectId, userId, updatedTimestamp, projectName, projectDescription, ROW_NUMBER() OVER (PARTITION BY projectId ORDER BY updatedTimestamp DESC) AS version_rank FROM projectInfo ) SELECT a.*, r.userId, r.updatedTimestamp, r.projectName, r.projectDescription FROM projects AS a LEFT JOIN ranked_info AS r ON a.id = r.projectId AND r.version_rank = 1;
执行结果验证
基于你提供的示例数据,上述SQL执行后返回结果如下,完全匹配查询需求:
| id | timestamp | projectType | creatorId | userId | updatedTimestamp | projectName | projectDescription |
|---|---|---|---|---|---|---|---|
| 1 | 2022-05-11 11:17:22 | Design | 1 | 2 | 2022-05-12 11:17:22 | McNuggets | Makes chicken nuggets and burgers |
| 2 | 2022-05-12 11:17:22 | Production | 2 | 1 | 2022-05-13 11:17:22 | An unrelated Project | Idk yet |
内容的提问来源于stack exchange,提问作者RyanR
相关产品推荐
相关产品推荐

