Подсчитать кол-во записей в каждой категории

250
21 декабря 2016, 01:46

Здравствуйте. Требуется на сайте произвести подсчет, сколько записей находится в каждой категории, а так же подсчитать общее кол-во всех записей.

Допустим, есть 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, это общее кол-во всех записей.

Answer 1

Вам нужно изучить 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

READ ALSO
SQL to json converting

SQL to json converting

У меня есть table на котором есть большая информация, мне нужно написать SELECT * FROM table, так чтобы SELECT возвращал меня информацию на JSON формате, например...

311
Как достать переменные из URL?

Как достать переменные из URL?

Добрый деньПишу интернет магазин, по одному курсу, который нашел на просторах интернета

276