Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Здравствуйте, пожалуйста подскажите как вывести категории с кол-ом записей.
Стандартная структура:
category
------------------------------
id parent name
1 0 кат1
2 0 кат2
3 2 кат3
4 2 кат4
post
-----------------------------
id name category
1 раз 1
2 два 3
3 три 4
Как вывести все категории, не важно в каком порядке, лиж бы все, и с кол-ом записей для каждой?
Пример:
id name count
1 кат1 1
2 кат2 2
3 кат3 1
4 кат4 1
ИЛИ
Пример 2:
id name count
1 кат1 1
2 кат2 0
3 кат3 1
4 кат4 1
Неактивен
Попробуйте
SELECT `id`, `name`, (SELECT count(*) FROM `post` WHERE category = c.id ) FROM `category` c;
или
SELECT c.id,c.name, count(p.id) FROM `post` p JOIN `category` c ON p.category = c.id
GROUP BY p.category;
Неактивен
Неактивен
Разница между моим вторым запросом и запросом vasya в том, что мой не выведет те категории, в которых нету постов вовсе.
Неактивен
Подводя итог, оптимальным будет твой первый запрос, который с подзапросом.
Неактивен
Подожди, а как же то, что там на каждой итерации подзапрос будет выполняться? Сколько уже копий на этот счет ломали в тредах .
Неактивен
Ну так тут объективно зависимый запрос.
При join так же на каждой строке первой таблицы будет идти обращение ко второй, а потом полученный массив группироваться. ИМХО, в данном случае подзапрос будет быстрее.
Неактивен
Довод принят ). По хорошему, надо бы стресс-тест устроить всех вариантов, но это лишь в том случае, если топикстартеру нужно будет сильно оптимизировать именно по скорости. Да и то, категорий вряд ли будут десятки/сотни тысяч, так что наверное скорости будут все же похожими.
Неактивен
Категорий может быть мало, а постов много. Тогда в случае join будет очень большая временная таблица перед группировкой.
С другой стороны count по индексированному полю очень быстрый. Отсюда и предпочтение подзапросу.
Неактивен
Большое спасибо ))
Неактивен
Страниц: 1