MySQL включает ноль строк при использовании COUNT с GROUP BY - PullRequest
0 голосов
/ 04 октября 2010

Я пытаюсь выполнить запрос, который группирует набор данных по атрибуту с именем type_id.

SELECT
vt.id AS voucher_type,
COALESCE(COUNT(v.id), 0) AS vouchers_remaining
FROM
vouchers v
INNER JOIN voucher_types vt
ON vt.id = v.type_id
WHERE
v.sold = 0
GROUP BY vt.id

В результате я хочу получить type_id и количество непроданных товаров, оставшихся для каждого типа. Это работает нормально, при условии, что остался хотя бы один, однако, если есть строка с нулевым счетом, она не возвращается в наборе результатов.

Как мне установить фиктивную строку для тех типов, у которых нет соответствующих строк для подсчета?

Любой совет будет принят с благодарностью.

Спасибо

Ответы [ 3 ]

3 голосов
/ 04 октября 2010

Вам придется использовать LEFT JOIN вместо INNER JOIN.Вы начинаете с выбора всех voucher_types , а затем оставляете соединение, чтобы найти количество.

SELECT
  voucher_types.id AS voucher_type,
  IFNULL(vouchers_count.vouchers_remaining, 0) AS vouchers_remaining
FROM
  voucher_types
LEFT JOIN
  (
    SELECT
    v.type_id AS voucher_type,
    COUNT(v.id) AS vouchers_remaining
    FROM
    vouchers v
    WHERE
    v.sold = 0
    GROUP BY v.type_id
  ) AS vouchers_count
  ON vouchers_count.voucher_type = voucher_types.id
0 голосов
/ 04 октября 2010

Поскольку вы делаете ВНУТРЕННЕЕ СОЕДИНЕНИЕ, вы автоматически исключаете типы без соответствующих ваучеров. Вам нужно ПРАВИЛЬНОЕ НАРУЖНОЕ СОЕДИНЕНИЕ.

Кроме того, насколько я помню, COUNT всегда будет давать вам целое число, поэтому нет необходимости в COALESCE.

Удачи, Alin

0 голосов
/ 04 октября 2010

Вы хотите ВНЕШНЕЕ СОЕДИНЕНИЕ (или ВЛЕВОЕ СОЕДИНЕНИЕ, такая же разница) вместо ВНУТРЕННЕГО СОЕДИНЕНИЯ. Это должно уже сделать свое дело.

...