MySQL行转列按propid合并数据 实现同ID属性值单行展示
问题根因
你当前查询返回多行的核心问题是分组字段选错了:用proptype作为分组依据,必然会把同一propid下不同属性类型的记录拆成独立行;同时CASE判断仅在当前行proptype匹配时才触发子查询取值,其余列全部留空,最终就出现了同一propid分散在多行的错误结果。
修正后SQL
直接使用条件聚合实现行转列,无需嵌套子查询,按propid分组即可保证每个ID仅返回一行:
SELECT propid, GROUP_CONCAT(CASE WHEN proptype = 'house' THEN propdetails END) AS house, GROUP_CONCAT(CASE WHEN proptype = 'acreage' THEN propdetails END) AS acreage, GROUP_CONCAT(CASE WHEN proptype = 'pool' THEN propdetails END) AS pool, GROUP_CONCAT(CASE WHEN proptype = 'apartment' THEN propdetails END) AS apartment FROM propdatabase GROUP BY propid;
逻辑说明
- 分组维度调整为
propid,从根本上保证每个房产ID仅输出一行记录 - 将聚合函数
GROUP_CONCAT写在最外层,配合CASE WHEN做值筛选:仅当记录的proptype匹配当前列的属性类型时,才传入propdetails参与拼接,不匹配时返回NULL,GROUP_CONCAT会自动忽略NULL值,不会拼接无效内容 - 该写法比原嵌套子查询写法执行效率更高,无匹配值的列会自动返回空值,和预期输出效果完全一致
内容的提问来源于stack exchange,提问作者Joey Martin
相关产品推荐
相关产品推荐

