Неверные результаты при использовании GROUP_CONCAT с условием условия where
У меня есть такая таблица:
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
Включено?
2 ответа
Сначала я написал бы подзапрос, который получает, какой генекс имеет альфа-код:
SELECT DISTINCT genex
FROM drugs
WHERE codeName = 'Alpha';
Затем вы можете использовать это как IN
предложение, поэтому он включает в себя только генекс, который будет иметь альфа в списке группового объединения:
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,%';
Но подзапрос почти наверняка будет более эффективным, чем любой из двух запросов выше.