Нужно было для своего нового проекта выполнить запрос, который возвращал-бы список категорий и количество записей в категории.
база данных состоит из двух таблиц:
1. Категории (id, имя);
2. Записи (id, id категории, текст).
Нашел в интернете целый ряд примеров запросов:
SELECT categories.*, COUNT(posts.id) FROM categories, posts WHERE categories.id=posts.id
SELECT categories.id, (SELECT count(*) from posts WHERE id=categories.id) as cnt FROM categories
SELECT categories.id, COUNT( * ) FROM categories LEFT JOIN posts ON ( posts.id ) GROUP BY categories.id
SELECT t.id, COUNT(p.id) as cnt FROM categories as t LEFT OUTER JOIN posts as p ON t.id=p.id GROUP BY t.id
SELECT t.*, COUNT(p.category_id) AS cnt FROM categories as t LEFT JOIN posts AS p ON (p.category_id=t.id) GROUP BY t.id ORDER BY id DESC
В принципе с поставленной задачей должны справляться они все. Но в моем случае все кроме последнего не выдавали должного результата.
Под рукой средства проверить нет, но первый запрос, нам моё имхо, должен выглядеть так (но такой подход не отобразит категории с нулевым кол-вом записей):
// ------------------------------------------------
SELECT categories.*, COUNT (posts.category_id)
FROM categories, posts
WHERE categories.id=posts.category_id
GROUP BY posts.category_id
// ------------------------------------------------
Второй запрос вообще в корень не верный...
Третий запрос должен выглядеть так (но он, у категорий с кол-вом постов 0 покажет кол-во постов 1... это из-за left join'а и значением null, которое посчитается):
/ ------------------------------------------------
SELECT categories.id, COUNT ( * )
FROM categories LEFT JOIN posts ON posts.category_id=categories.id
GROUP BY categories.id
/ ------------------------------------------------
Четвертый запрос — почти то, что надо. Объеденять надо только по другому, и считать лучше другое:
/ ------------------------------------------------
SELECT t.id, COUNT (p.category_id) as cnt
FROM categories as t LEFT OUTER JOIN posts as p ON t.id=p.category_id
GROUP BY t.id
/ ------------------------------------------------
А теперь если присмотреться, то увидим, что четвертый запрос — это почти 5. Только 5 — кривой.
Вывод: плохо знаешь SQL, товарищ
С уважением, ваш покорный слуга
Граф Монте-Кристо!