Неверные результаты при использовании 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,%';

Но подзапрос почти наверняка будет более эффективным, чем любой из двух запросов выше.

Другие вопросы по тегам