【问题标题】:Incorrect results when using GROUP_CONCAT with a where clause condition将 GROUP_CONCAT 与 where 子句条件一起使用时结果不正确
【发布时间】:2015-02-26 19:49:53
【问题描述】:

我有一张这样的桌子:

ID | GenEx   | CodeName | Desc
----------------------------
1  | Cipro   | Dolvo    | 
2  | Ludavil | Ymir     | 
3  | Cipro   | Alpha    |

我的查询是这样的:

SELECT GenEx, GROUP_CONCAT(CodeName) AS Code 
FROM Drugs D 
WHERE `CodeName` IN ('Alpha')
GROUP BY GenEx;

我想要的结果是:

| Genex |    Code     |
+-------+-------------+
| Cipro | Dolvo,Alpha |

我得到的结果是:

| Genex |    Code     |
+-------+-------------+
| Cipro | Alpha,Alpha |

WHERE IN() 子句导致GROUP_CONCAT 替换任何返回的内容以匹配该限制集。只要包含Alpha,我怎样才能让它匹配该集合之外的代码?

【问题讨论】:

  • b/c 这是一个例子,在更复杂的查询中我需要 where
  • 我明白了。我删除了我的评论,我第一次阅读时误解了。

标签: mysql sql group-concat


【解决方案1】:

我会首先编写一个子查询来获取哪个基因有 alpha 代码:

SELECT DISTINCT genex
FROM drugs
WHERE codeName = 'Alpha';

然后,您可以将其用作您的 IN 子句,因此它仅包含在组连接列表中具有 Alpha 的基因:

SELECT genex, GROUP_CONCAT(code_name)
FROM drugs
WHERE genex IN (
   SELECT DISTINCT genex
   FROM drugs
   WHERE codeName = 'Alpha')
GROUP BY genex;

编辑

关于您的子查询的一个小提示,如果您想检查多个代码,您仍然可以将WHERE =替换为IN

SELECT DISTINCT genex
FROM drugs
WHERE codeName IN ('Alpha');

这是一个SQL Fiddle 示例。

【讨论】:

  • @Undermine2k 没问题,很高兴能帮上忙!
【解决方案2】:

如果您不想使用子查询(无论出于何种原因),您可以试试这个:

SELECT GenEx, GROUP_CONCAT(CodeName) AS Code 
  FROM Drugs D 
 GROUP BY GenEx
HAVING 'Alpha' REGEXP GROUP_CONCAT(CodeName SEPARATOR '|');

或:

SELECT GenEx, GROUP_CONCAT(CodeName) AS Code 
  FROM Drugs D 
 GROUP BY GenEx
HAVING CONCAT(',',GROUP_CONCAT(CodeName),',') LIKE '%,Alpha,%';

但子查询几乎肯定会比上述两个查询中的任何一个更有效。

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2014-04-13
    • 2016-05-06
    • 1970-01-01
    • 2012-08-06
    • 2011-05-16
    • 2018-11-30
    • 2020-02-14
    • 2023-03-27
    相关资源
    最近更新 更多