将 GROUP_CONCAT 与 where 子句条件一起使用时的结果不正确

Incorrect results when using GROUP_CONCAT with a where clause condition

我有一个 table 这样的:

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,我怎样才能让它匹配该组之外的代码?

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

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

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

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 示例。

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

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,%';

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