2009-10-01 1 views
1

У меня есть запрос, как это:Как сделать LEFT JOIN работать с группировкой/подсчетом в MySQL?

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

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

ответ

3

Делают 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

[EDIT] Вот пример. Если мы имеем следующие данные:

 
    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 !)

+0

Я пробовал это с помощью count (*), прежде чем правильно читать ваш ответ, а отсутствующий тип возвратил 2 в качестве счетчика. Использование count (page.type), как вы сказали, дает 0. Почему это происходит? – DisgruntledGoat

+0

Кажется, что использование count (type.id) возвращает 2. – DisgruntledGoat

+1

'COUNT (*)' подсчитывает все строки. 'COUNT (page.type)' только считает строки, где page.type не NULL. Когда вы выполняете JOIN, как в моем ответе, строки для 'types', у которых нет' '' '' '' '' '' '' 'столбцов' 'столбцов, равных NULL. Когда мы выполняем 'COUNT (page.type)', мы только подсчитываем строки 'types', у которых есть' pages' (столбцы страницы не равны нулю). – hrnt

0

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') 
2

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

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