MySQL GROUP_CONCAT + IN () = недостающие данные :-( - PullRequest
1 голос
/ 05 апреля 2010

Пример:

Таблица: коробка

boxID  color
 01     red
 02     blue
 03     green

Таблица: коробка имеет

boxID  has
 01     apple
 01     pear
 01     grapes
 01     banana
 02     lime
 02     apple
 02     pear
 03     chihuahua
 03     nachos
 03     baby crocodile

Я хочу запросить содержимое каждого поля и вернуть таблицу с каждым идентификатором, цветом и столбцом, объединяющим содержимое каждого поля, поэтому я использую:

SELECT box.boxID, box.color,
GROUP_CONCAT(DISTINCT boxHas.has SEPARATOR ", ") AS contents
FROM box
LEFT JOIN boxHas ON box.boxID=boxHas.boxID
WHERE boxHas.has IN ('apple','pear')
GROUP BY box.boxID
ORDER BY box.boxID

и я получаю следующую таблицу результатов:

boxID  color  contents
 01     red    apple, pear
 02     blue   apple, pear

Мой вопрос к вам: почему в нем не указаны ВСЕ значения has в столбце contents? Почему мое WHERE утверждение также обрезает мое GROUP_CONCAT?

Таблица, которую я собирался получить:

boxID  color  contents
 01     red    apple, banana, grapes, pear
 02     blue   apple, lime, pear

Хотя я хочу ограничить свои результаты boxID на основе оператора WHERE, я не хочу ограничить поле contents для допустимых полей. : - /

Помощь

1 Ответ

2 голосов
/ 05 апреля 2010

Вы должны использовать предложение HAVING вместо WHERE:

SELECT box.boxID
     , box.color
     , GROUP_CONCAT(DISTINCT boxHas.has SEPARATOR ", ") AS contents
  FROM box
  LEFT JOIN boxHas 
    ON box.boxID=boxHas.boxID
 GROUP BY box.boxID
HAVING SUM(boxHas.has IN ('apple','pear')) >= 2
 ORDER BY box.boxID
...