mysql中的group_concat与“case when”条件

Posted

技术标签:

【中文标题】mysql中的group_concat与“case when”条件【英文标题】:group_concat in mysql with "case when " conditions 【发布时间】:2015-07-08 11:18:12 【问题描述】:

我在mysql环境中写了sql代码来连接数据。但是,我无法得到正确的结果,而且我对我的 sql 代码有什么问题感到困惑。我的sql代码如下:

SELECT case when cc.complex_check_id = cmt.comp_o_id then cc.status cstatus,sgk.status sgstatus,cc.NAME complex_check_name,cc.min min_flag,cmt.comp_t_name cmpt_name,group_concat(concat(concat(concat(concat(concat(f.NAME, ';') , sgk.NAME),' ') ,cc.operator),' '))
else cc.status cstatus,sgk.status sgstatus,cc.NAME complex_check_name,cc.min min_flag,'not' as cmpt_name,group_concat(concat(concat(concat(concat(concat(f.NAME, ';') , sgk.NAME),' ') ,cc.operator),' ')) end res_string 
FROM complex_check_anag cc,lnksinglechecktocomplexcheck lk,single_check_anag sgk,functionalci f ,lnkconfigurationitemtosinglecheck lkcg,comp_t_anag cmt
WHERE cc.complex_check_id = lk.complex_check_id AND sgk.single_check_id = lk.single_check_id and f.id = lkcg.config_item_id  
and sgk.single_check_id = lkcg.single_check_id and sgk.status = 'active' GROUP BY cc.NAME

您能给我一些建议吗?...非常感谢你们!

【问题讨论】:

I couldn't get the correct result 描述性不强。 对不起,我的意思是执行查询时有错误信息 这更接近了,但还有两件事:错误消息究竟是什么,以及正确的结果是什么(您要达到什么目的)。请把这些放在问题中。 错误消息是:“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在 'cstatus,sgk.status sgstatus,cc.NAME 附近使用的正确语法complex_check_name,cc.min min_flag,cmt.comp_' 在第 1 行 " 正确的结果应该是,当"case"条件满足时:"active active AN1WVS01 0 not MIL04APPBOXIP01;cpu_check and ,MIL04APPBOXIP01;memory check and " ;当“case”条件不满足时:“active active AQ1PVS01 0 AL1WVS01 MIL04DCW003;cpu test check and” 【参考方案1】:

您用于CASE 表达式的语法不正确,您只能在 case 表达式中选择一个表达式,但是您选择了不止一列,我注意到您只需要选择一列基于case 条件,所以我将除该列之外的所有列移出 case 表达式,如下所示:

SELECT 
  cc.status cstatus, 
  sgk.status sgstatus,
  cc.NAME complex_check_name, 
  cc.min min_flag,
  group_concat(concat(concat(concat(concat(concat(f.NAME, ';') , sgk.NAME),' ') ,cc.operator),' ')),
  case when cc.complex_check_id = cmt.comp_o_id then cmt.comp_t_name 
                                                else 'not' as 
                                                end res_string 
FROM complex_check_anag cc ....
.... the rest of your query here

此外,您可以使用INNER JOIN 代替旧的join 语法重写您的查询,如下所示:

SELECT 
  cc.status cstatus, 
  sgk.status sgstatus,
  cc.NAME complex_check_name, 
  cc.min min_flag,
  group_concat(concat(concat(concat(concat(concat(f.NAME, ';') , sgk.NAME),' ') ,cc.operator),' ')),
  case when cc.complex_check_id = cmt.comp_o_id then cmt.comp_t_name 
                                                else 'not' as 
                                                end res_string 
FROM complex_check_anag cc, comp_t_anag cmt
INNER JOIN lnksinglechecktocomplexcheck lk ON cc.complex_check_id = lk.complex_check_id
INNER JOIN functionalci f ON f.id = lkcg.config_item_id  
INNER JOIN lnkconfigurationitemtosinglecheck lkcg ON sgk.single_check_id = lk.single_check_id
INNER JOIN single_check_anag sgk ON sgk.single_check_id = lkcg.single_check_id
WHERE sgk.status = 'active' 
GROUP BY cc.NAME

请注意,您没有在两个表complex_check_anag cc, comp_t_anag cmt 之间指定任何条件,因此您将在两个表之间得到一个笛卡尔积,它可能不会为您提供正确的数据。因此,请检查这两个表之间的关系,并在它们之间添加适当的连接类型,以获得您要查找的正确数据。

【讨论】:

非常感谢您的建议。我已经尝试过两个查询,但它不起作用,“case when”条件附近有错误消息。我很困惑将“case when”与“Group_cancat”一起使用。非常感谢! @AnwarAhmad - 对不起,这是我的错,我忘记了, 之前的情况,尝试我更新的查询。 是的,你是对的。现在可以了。非常感谢,祝你有美好的一天!【参考方案2】:
select group_concat(concat( case when ProStatus='A' then round(proQnty) else 0 end,':',prodtmappid) separator',') as result from tblproductmapforlisting where
 prodtmappid in (329607,329606,329605,329604) order by FIELD(prodtmappid,329607,329606,329605,329604)

【讨论】:

答案应该解释它是如何解决问题的以及为什么。 虽然此代码可能有助于解决问题,但提供有关 why 和/或 如何 回答问题的附加上下文将显着改善其长期价值。请edit你的答案添加一些解释。

以上是关于mysql中的group_concat与“case when”条件的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy:group_concat(case when ...)可能吗?

MySQL -- 行转列 -- GROUP_CONCAT -- MAX(CASE WHEN THEN)

如何使用 IF 或 Case 函数来汇总 GROUP_CONCAT 列?然后将其应用于原始数据表?

GROUP_CONCAT 中的双重结果与 MySQL 中的双重 JOIN

MySQL UPDATE 与 GROUP_CONCAT 加入三个表

SQL 中的 STUFF 等效函数(MySQL 中的 GROUP_CONCAT / Oracle 中的 LISTAGG)