MySQL: получить записи из базы данных и добавить в строки столбец COUNT()

Я пытаюсь извлечь книги из одной таблицы и присоединиться к таблице глав. Что мне нужно из второй таблицы, так это просто COUNT() глав, доступных для этих книг, и добавить это значение в качестве дополнительного столбца, называемого главами (или что-то еще).

Моя текущая попытка выглядит так: ВЫБЕРИТЕ b.*, подсчитайте (c.chapter_nr) как главы FROM books as b left, присоедините главы как c к c.book_id = b.id

Это получает только одну из таблицы книг и добавляет результат count() в эту строку, но я хотел бы получить ВСЕ строки из таблицы книг, следовательно, LEFT JOIN


person EarthMind    schedule 07.12.2009    source источник


Ответы (4)


SELECT b.*, count(c.chapter_nr) as chapters 
FROM books as b 
LEFT JOIN chapters as c on (c.book_id = b.id)
GROUP BY b.id

ОБЪЯСНЕНИЕ

Вам нужно сгруппировать книги, чтобы определить фактическое количество глав. Если бы вы пропустили предложение GROUP BY, вы получили бы результирующий набор всех глав каждой книги. Вы просто хотите ограничить результаты уникальными книгами и соответствующим количеством глав.

person Corey Ballou    schedule 07.12.2009

Вам не хватает предложения GROUP BY:

SELECT b.*, count(c.chapter_nr) as chapters 
FROM books AS b 
LEFT JOIN chapters AS c ON c.book_id = b.id 
GROUP BY b.id
person Residuum    schedule 07.12.2009

Пытаться :

SELECT b.*,  
(select count(*) from chapters c where c.book_id = b.id) as chapters   
FROM books b

Это вернет 0, если в книге нет глав.

person Steve De Caux    schedule 07.12.2009
comment
Проблема с методами левого внешнего соединения заключается в том, что они имеют тенденцию возвращать минимальное число 1, даже если нет строк глав. - person Steve De Caux; 07.12.2009
comment
При использовании методов левого внешнего соединения, пока вы считаете ненулевой атрибут глав (например, chapter_nr), вы получите 0 для книги без глав. - person Phil Ross; 07.12.2009

Непроверено, но вам нужно предложение "group by", чтобы делать то, что вы хотите:

Select b.*, count(*) as chapters
from books b left outer join chapters c
on c.book_id = b.id
group by b.*
person Wes    schedule 07.12.2009
comment
Это вернет 1 как количество глав для книг, в которых нет глав. Измените count(*) на count(c.chapter_nr), чтобы подсчитать количество глав (строки с ненулевым chapter_nr). - person Phil Ross; 07.12.2009