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

MySQL多表联查如何保留全部progressions行且仅展示一条用户数据

实现方案

由于你当前业务中所有查询到的progressions都归属同一个用户,可通过以下两种方式实现需求:

方式1:SQL层面直接返回格式化结果

使用窗口函数标记行序号,仅第一行展示用户信息,其余行用户字段置空,完整保留所有progressions行数据:

SELECT 
  CASE WHEN row_num = 1 THEN users.id ELSE NULL END AS user_id,
  CASE WHEN row_num = 1 THEN users.lastname ELSE NULL END AS lastname,
  CASE WHEN row_num = 1 THEN users.firstname ELSE NULL END AS firstname,
  progressions.id AS progression_id,
  progressions.axis,
  progressions.topic_id
FROM (
  SELECT 
    users.id,
    users.lastname,
    users.firstname,
    progressions.id,
    progressions.axis,
    progressions.topic_id,
    ROW_NUMBER() OVER (PARTITION BY users.id) AS row_num
  FROM `progressions`
  JOIN topics on topics.id = progressions.topic_id
  JOIN criteria on criteria.id = topics.criteria_id
  JOIN cards on cards.id = criteria.card_id
  JOIN users on users.id = cards.user_id
) AS combined_data;

如果使用MySQL数据库,也可以把CASE WHEN替换为更简洁的IF(row_num = 1, 字段值, NULL)写法。

方式2:应用层处理(更推荐)

保留原查询语句不变,在业务代码中拆分数据:

  • 提取结果集第一条的用户信息单独存储,用于用户模块展示
  • 遍历全量结果集,仅取出progressions.id、progressions.axis、progressions.topic_id三个字段生成进度列表
    该方式将查询逻辑和展示逻辑分离,后续调整规则时不需要修改SQL,可维护性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:18:00