You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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执行后返回结果如下,完全匹配查询需求:

idtimestampprojectTypecreatorIduserIdupdatedTimestampprojectNameprojectDescription
12022-05-11 11:17:22Design122022-05-12 11:17:22McNuggetsMakes chicken nuggets and burgers
22022-05-12 11:17:22Production212022-05-13 11:17:22An unrelated ProjectIdk yet

内容的提问来源于stack exchange,提问作者RyanR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 20:51:25