Здравствуйте. Требуется на сайте произвести подсчет, сколько записей находится в каждой категории, а так же подсчитать общее кол-во всех записей.
Допустим, есть 10 записей и 5 категорий. Каждая из 10 записей, относится ко всем 5 категориям (category='1,2,3,4,5').
Изначально пользовался запросом:
SELECT c.id, (SELECT COUNT(*) FROM dle_post p WHERE p.category = c.id) as newscount FROM dle_category c;
Получал массив с id категорий и кол-вом записей(newscount) в них.
id newscount
1 10
2 0
3 0
4 0
5 0
А общее кол-во всех записей я подсчитывал, складывая значения 'newscount' уже в цикле php.
Но так как у меня каждая запись относится к нескольким категориям, мой запрос работал не корректно, он учитывал только первый id в ячейке 'category'.
Ситуацию исправил запросом:
SELECT c.id, (SELECT COUNT(*) FROM dle_post p WHERE p.category REGEXP (concat('[[:<:]]',c.id,'[[:>:]]'))) as newscount FROM dle_category c;
Он обрабатывал уже все категории, которые имеются в ячейке 'category'.
id newscount
1 5
2 5
3 5
4 5
5 5
Но проблема в том, что, я теперь не знаю, как узнать общее кол-во всех записей? Ведь уже простое складывание в цикле php значений находящихся в 'newscount' выдаст неверные результаты.
Вот собственно сам код с запросом и обработкой:
$count_news = $db->query("SELECT ct.id, (SELECT COUNT(*) FROM " . PREFIX . "_post ps WHERE ps.category = ct.id) as newscount FROM " . PREFIX . "_category ct");
while ( $res_count = $db->get_row($count_news) ) {
$count_cat .= "\r\n" . $res_count['id'] . "|" . $res_count['newscount'];
$all_news = $all_news+$res_count['newscount'];
}
$count_all = "0|" . $main_news . $count_cat;
На выходе получаем:
0|10
1|10
2|0
...
5|0
Первая строчка с id=0, это общее кол-во всех записей.
Вам нужно изучить JOIN
, он во много раз быстрее, чем вложенные запросы. Тогда вместо одного монстра сделайте просто 2 относительно легких запроса:
SELECT
count(p.post_id)
FROM
dle_category c left join dle_post p on c.id=p.category group by c.id;
Второй запрос (если у вас правильно расставлены ключи) будет вообще невесомый, нужно лишь посчитать кол-во ключей:
SELECT
count(distinct p.post_id)
FROM
dle_post p
Рабочий пример: http://sqlfiddle.com/#!9/34d5f4/5
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть table на котором есть большая информация, мне нужно написать SELECT * FROM table, так чтобы SELECT возвращал меня информацию на JSON формате, например...
Добрый деньПишу интернет магазин, по одному курсу, который нашел на просторах интернета