Как заставить LEFT JOIN работать с группировкой / количеством в MySQL? - PullRequest
1 голос
/ 01 октября 2009

У меня такой запрос:

SELECT type.id, type.name, COUNT(*) AS tot
FROM page
LEFT JOIN type ON page.type=type.id
GROUP BY type.id

Тем не менее, он не выбирает все типы: он пропускает все типы, которых еще нет в таблице страниц. Я просто хочу, чтобы он перечислял каждый тип с числом, представляющим, сколько страниц имеет этот тип, включая 0, где тип не встречается. Нужно ли другое соединение?

Ответы [ 3 ]

3 голосов
/ 01 октября 2009

Сделайте RIGHT JOIN вместо этого. Попробуйте это:

SELECT type.id, type.name, COUNT(page.type) AS tot
FROM page
RIGHT JOIN type ON page.type=type.id
GROUP BY type.id

Обратите внимание на другой способ подсчета. page.type будет NULL для типов, которые не имеют страницы. Такие строки будут игнорироваться при выполнении COUNT

[РЕДАКТИРОВАТЬ] Вот пример. Если у нас есть следующие данные:

  type
id  name
 1     A
 2     B
 3     C

  page
id   type
 1     1
 2     1
 3     2

Если мы сделаем JOIN как в моем ответе (без GROUP BY или COUNT), наш набор результатов будет выглядеть так:

type.id  type.name  page.id  page.type
      1          A        1          1
      1          A        2          1
      2          B        3          2
      3          C     NULL       NULL

Теперь, когда мы делаем GROUP BY и COUNT(type.id), мы считаем строки где type.id не равен NULL. Это будет все строки: результат 2 для A и 1 для B и C.

Если вместо этого мы сделаем COUNT(page.type), мы получим 2 для A, 1 для B и 0 для C (потому что page.type было NULL для C!)

2 голосов
/ 01 октября 2009

Левое объединение возвращает все строки из таблицы с левой стороны выражения объединения, независимо от того, существуют ли они в таблице с правой стороны, попробуйте это (переключив стороны выражения):

SELECT type.id, type.name, COUNT(*) AS tot
FROM  type 
LEFT JOIN  page ON type.id=page.type
GROUP BY type.id, type.name
0 голосов
/ 01 октября 2009

USE Coalesce для присвоения NULL значения GROUP BY

SELECT
    COALESCE(type.id, 0),
    COALESCE(type.name, 'NoType'),
    COUNT(*) AS tot
FROM
    page
LEFT JOIN
    type
ON
    page.type=type.id
GROUP BY
    COALESCE(type.id, 0),
    COALESCE(type.name, 'NoType')
...