如果group_concat不返回值,有什么解决方法?
P粉212971745
P粉212971745 2023-08-30 19:44:24
[MySQL讨论组]

我写了一个查询,根据条件将几行转换为列。

然而,有些情况下没有行满足条件,但我希望返回一些结果。

下面是表格的示例和我要寻找的结果。

源表:

id respondent_id 人口统计 问题 回答
1 1 已检查 年龄 30
2 1 教育 硕士
3 1 已检查 身高 1.8m
4 1 收入 $1
5 1 地址 国际空间站
6 1 才艺 跳舞
7 2 已检查 年龄 20
8 2 教育 高中
9 2 已检查 身高 4m
10 2 收入 $3.2
11 2 地址 高海
12 2 才艺 唱歌

转换后的示例结果:

id respondent_id 年龄 身高 问题 答案
2 1 30 1.8m 教育 硕士
4 1 30 1.8m 收入 $1
5 1 30 1.8m 地址 国际空间站
6 1 30 1.8m 才艺 跳舞
8 2 20 4m 教育 高中
10 2 20 4m 收入 $3.2
11 2 20 4m 地址 高海
12 2 20 4m 才艺 唱歌

当前的MySQL语句:

SET @sql = NULL;


SELECT 
GROUP_CONCAT(DISTINCT
    CONCAT(
      '(SELECT l.answer FROM source_table l where l.respondent_id = a.respondent_id AND  l.question = ', b.question,')
      AS ',b.question
    )
  ) INTO @sql
FROM source_table b
WHERE b.demographic IS NOT NULL;


SET @sql = 
CONCAT('SELECT respondents_id,    
              ',@sql,',
        a.question , a.answer     
        FROM   source_table a
        WHERE a.demographic IS NULL
        GROUP BY id
       ');

PREPARE stmt FROM @sql;
EXECUTE stmt;

为了澄清,上述查询在有“checked”的人口统计列时有效,但是当没有“checked”单元格时,整个查询失败。

因此,我希望有一个查询在所有情况下都能工作,无论是否有人口统计行。

如果没有人口统计行,则查询应该返回没有新列的数据。

P粉212971745
P粉212971745

全部回复(2)
P粉043295337

我有点困惑为什么你要使用动态SQL。窗口函数似乎可以实现你想要的功能:

select t.*
from (select t.*,
             max(case when question = 'Age' then answer end) over (partition by respondent_id ) as age,
             max(case when question = 'height' then answer end) over (partition by respondent_id ) as height
      from source_table st
     ) t
where demographic is null;

如果你不知道“checked”列,我想你可以将此作为模板使用。

P粉823268006

@FaNo_FN @ysth

我使用你发布的fiddle和你的评论成功修复了它。

我在两个查询之间添加了以下代码来检查变量是否设置。

SET @sql := IF(@sql IS NULL,'',@sql);

我还在GROUP_CONCAT之前添加了第二个CONCAT()来添加一个','分隔符。

这是fiddle的链接。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号