将 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,%';
但是子查询几乎肯定比上面两个查询中的任何一个都更有效。
我有一个 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,%';
但是子查询几乎肯定比上面两个查询中的任何一个都更有效。