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

MySQL如何将同一paper_id的属性按attribute_id顺序合并为单行?

在MySQL中实现同一paper_id的多列合并

完全可行,以下两种方法可以实现你想要的效果:

方法一:固定attribute_id时使用条件聚合

如果你的attribute_id数量和顺序是固定的(比如示例中的1-4),可以用条件聚合提取每个attribute对应的值,再拼接成目标格式:

SELECT
  paper_id,
  CONCAT_WS(',',
    paper_id,
    MAX(CASE WHEN attribute_id = 1 THEN string_value END),
    MAX(CASE WHEN attribute_id = 2 THEN date_value END),
    MAX(CASE WHEN attribute_id = 3 THEN string_value END),
    MAX(CASE WHEN attribute_id = 4 THEN date_value END)
  ) AS combined_result
FROM r_paper_attribute
GROUP BY paper_id
ORDER BY paper_id;

说明:

  • CASE WHEN会根据attribute_id匹配对应的字段值,每个paper_id下只有一个非空值,用MAX()可以准确提取该值
  • CONCAT_WS()会自动忽略空值,按指定的逗号分隔符拼接所有内容

方法二:动态attribute_id时使用GROUP_CONCAT

如果attribute_id的数量不固定,推荐用这种动态拼接的方式:

SELECT
  paper_id,
  CONCAT_WS(',',
    paper_id,
    GROUP_CONCAT(
      COALESCE(string_value, date_value)
      ORDER BY attribute_id SEPARATOR ','
    )
  ) AS combined_result
FROM r_paper_attribute
GROUP BY paper_id
ORDER BY paper_id;

说明:

  • COALESCE(string_value, date_value)会优先取非空的string_value,为空则取date_value,刚好匹配你的表结构(每行只有一个值非空)
  • GROUP_CONCAT(...) ORDER BY attribute_id确保拼接顺序严格按照attribute_id升序排列,这应该是你之前用GROUP_CONCAT没达到预期的关键——没指定排序规则
  • 最后用CONCAT_WS()把paper_id和拼接后的属性值连起来

执行以上任意一种SQL,都能得到你期望的结果:比如paper_id=1会输出1,foo,2023-01-01,bar,2023-02-03,paper_id=2会输出2,foo,2023-02-01,bar。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:23:34