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
相关产品推荐
相关产品推荐

