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

