Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
1

Как правильно сделать запрос к MySQL для подсчета записей

05.11.2016, 20:43. Просмотров 688. Ответов 15
Метки нет (Все метки)

Всем привет.
Сделал себе вот такой вывод всех категорий на главной странице сайта (CMS DLE):
ссылка удалена

Выводится: название и ссылка на категорию, кол-во новостей у данной категории и изображение из новости, которая относится к данной категории.

Вот сам запрос, через который и вывожу всю нужную мне инфу:
Кликните здесь для просмотра всего текста
PHP
1
$sql_cat = $db->query("SELECT c.*, (SELECT COUNT(*) FROM dle_post p WHERE p.category = c.id) as count_news, (SELECT images FROM dle_post p WHERE p.category = c.id LIMIT 1) as images FROM dle_category c ORDER BY c.id);


Проблема в том, что, новости на сайте публикуются в несколько категорий и по этому подсчет новостей идёт не правильно.
Так как при пересчете новостей у категории, новость присваивается только к той категории, ID категории которой идёт первый в списке у новости.

Пример:
Идёт подсчет кол-ва новостей у категории ID=6

Запись, где category="2,4,6,9" - Не учитывается. Так как ID категории не первый в списке
Запись, где category="6,8,6,9" - Учитывается. Так как ID категории первый в списке

Как решить данную проблему?

P.S. Нагрузка не важна, так как всё дело кешируется, а кеш обновляется очень и очень редко.
 Комментарий модератора 
Загружайте картинки на форум. Под редактором сообщений есть секция "Загрузить файлы"
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2016, 20:43
Ответы с готовыми решениями:

Подскажите как сделать правильно запрос на MySql
Добрый день. Пожалуйста, подскажите как сделать запрос на вывод данных из MySQL Задача такая на...

Запрос для вывода только одной из повторяющихся записей
структура id id2 text 1 99 test 2 99 test 3 105 test 4 105 test ...

Как правильно сформировать запрос mysql в pdo?
Здравствуйте, У меня есть два вопроса: Как правильно сформировать массив подстановки в execute? Как...

КАК правильно организовать запрос по фильтру в полях SET MySQL
Существует таблица, в ней два поля SET, делаю фильтр по параметрам, передаю через форму 4 параметра...

15
Эксперт PHP
2386 / 2142 / 990
Регистрация: 14.05.2014
Сообщений: 6,257
Записей в блоге: 1
05.11.2016, 22:09 2
Цитата Сообщение от bestazzz Посмотреть сообщение
Так как при пересчете новостей у категории, новость присваивается только к той категории, ID категории которой идёт первый в списке у новости.
Такая проблема решается типом связей "многие ко многим". Создается таблица с полями: id, id_news, id_category. В таблицу заносятся данные не как у вас - в одну ячейку и через запятую, а так - на один id новости один id категории.
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
05.11.2016, 22:32  [ТС] 3
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Такая проблема решается типом связей "многие ко многим". Создается таблица с полями: id, id_news, id_category. В таблицу заносятся данные не как у вас - в одну ячейку и через запятую, а так - на один id новости один id категории.
Через regexp это не решить?

Я не шарю в Mysql, но вот если нужно узнать кол-во записей у конкретной категории, то делаю так:
SQL
1
SELECT COUNT(*) AS COUNT FROM dle_post WHERE category REGEXP '[[:<:]](6)[[:>:]]'
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
06.11.2016, 01:02 4
bestazzz, REGEXP тут излишне, можно использовать LIKE
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
06.11.2016, 10:36  [ТС] 5
Цитата Сообщение от renat_dmitriev Посмотреть сообщение
bestazzz, REGEXP тут излишне, можно использовать LIKE
LIKE работает не корректно. Если ищем записи у категории с ID=6, то like и учитывает записи, которые относятся к категории ID=16 и ID=66.

Проблему из первого поста решил с помощью:
SQL
1
REGEXP (concat('[[:<:]]',c.id,'[[:>:]]'))
А вообще, спасибо модератору, который ответил выше и порекомендовал сделать "многие ко многим". Буду реализовывать.
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
06.11.2016, 10:51 6
SQL
1
LIKE "," + ID + ","
Цитата Сообщение от bestazzz Посмотреть сообщение
А вообще, спасибо модератору, который ответил выше и порекомендовал сделать "многие ко многим". Буду реализовывать.
Это правильно.
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
06.11.2016, 11:23  [ТС] 7
Цитата Сообщение от renat_dmitriev Посмотреть сообщение
LIKE "," + ID + ","
Странно, но почему то не работает, вот запрос целиком:
SQL
1
SELECT c.*, (SELECT COUNT(*) FROM dle_post p WHERE p.category LIKE "," + c.id + ",") AS count_news, (SELECT images FROM dle_post p WHERE p.category = c.id LIMIT 1) AS images FROM dle_category c ORDER BY c.cat_views DESC
Выдаёт ошибку синтаксиса.
А если сделать так:
SQL
1
LIKE '," + c.id + ",'
Ошибки нет, но и записи в категориях не подсчитывает.
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
06.11.2016, 11:38 8
bestazzz, Попробуйте так

SQL
1
SELECT c.*, (SELECT COUNT(*) FROM dle_post p WHERE CONCAT(',', p.category, ',') LIKE "*," + c.id + ",*") AS count_news, (SELECT images FROM dle_post p WHERE p.category = c.id LIMIT 1) AS images FROM dle_category c ORDER BY c.cat_views DESC
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
06.11.2016, 12:18  [ТС] 9
Цитата Сообщение от renat_dmitriev Посмотреть сообщение
bestazzz, Попробуйте так
SQL
Выделить код
1
SELECT c.*, (SELECT COUNT(*) FROM dle_post p WHERE CONCAT(',', p.category, ',') LIKE "*," + c.id + ",*") AS count_news, (SELECT images FROM dle_post p WHERE p.category = c.id LIMIT 1) AS images FROM dle_category c ORDER BY c.cat_views DESC
Всё равно ошибку синтаксиса выдаёт
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
06.11.2016, 12:21 10
bestazzz, Сорри, опять поставил двойные кавычки вместо одинарных, надо вот так


SQL
1
SELECT c.*, (SELECT COUNT(*) FROM dle_post p WHERE CONCAT(',', p.category, ',') LIKE '*," + c.id + ",*') AS count_news, (SELECT images FROM dle_post p WHERE p.category = c.id LIMIT 1) AS images FROM dle_category c ORDER BY c.cat_views DESC
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
06.11.2016, 12:37  [ТС] 11
Цитата Сообщение от renat_dmitriev Посмотреть сообщение
bestazzz, Сорри, опять поставил двойные кавычки вместо одинарных, надо вот так
SQL
Выделить код
1
SELECT c.*, (SELECT COUNT(*) FROM dle_post p WHERE CONCAT(',', p.category, ',') LIKE '*," + c.id + ",*
Теперь работает, но кол-во записей у всех категорий выводит 0
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
06.11.2016, 12:51 12
bestazzz, Так должно работать, проверил у себя =)

SQL
1
SELECT c.*, (SELECT COUNT(*) FROM dle_post p WHERE CONCAT(',', p.category, ',') LIKE '%," + c.id + ",%') AS count_news, (SELECT images FROM dle_post p WHERE p.category = c.id LIMIT 1) AS images FROM dle_category c ORDER BY c.cat_views DESC
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
06.11.2016, 13:04  [ТС] 13
Цитата Сообщение от renat_dmitriev Посмотреть сообщение
bestazzz, Так должно работать, проверил у себя =)
Странно, всё равно показывает 0 записей в категориях
0
Миниатюры
Как правильно сделать запрос к MySQL для подсчета записей  
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
06.11.2016, 13:12  [ТС] 14
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Такая проблема решается типом связей "многие ко многим". Создается таблица с полями: id, id_news, id_category. В таблицу заносятся данные не как у вас - в одну ячейку и через запятую, а так - на один id новости один id категории.
Получается, если у меня 100к записей, каждая из которых будет принадлежать к 5 категориям, связывающая таблица будет иметь 500к записей?
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
06.11.2016, 13:20 15
Цитата Сообщение от bestazzz Посмотреть сообщение
Странно, всё равно показывает 0 записей в категориях
Имел ввиду, что работает конструкция LIKE таким образом, про весь ваш запрос не знаю. А если LIKE Заменить на REGEXP то все корректно считается7 Если да, то странно.

Цитата Сообщение от bestazzz Посмотреть сообщение
Получается, если у меня 100к записей, каждая из которых будет принадлежать к 5 категориям, связывающая таблица будет иметь 500к записей?
Да. Но зато поиск будет моментальным.

Добавлено через 3 минуты
bestazzz, Еще как вариант если немного категорий, то использовать поле с типом SET и хранить категории в нем.
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
16.12.2016, 19:37  [ТС] 16
Появилась проблема по данной теме.

Допустим, есть 10 записей и 5 категорий. Каждая из 10 записей, относится ко всем 5 категориям (то есть, у записи: category='1,2,3,4,5').
Нужно подсчитать, сколько записей содержится в каждой категории, плюс подсчитать общее кол-во записей.

При подсчете записей для каждой категории, запрос:
SQL
1
SELECT c.id, (SELECT COUNT(*) FROM dle_post p WHERE p.category = c.id) AS newscount FROM dle_category c;
Выдаёт неверные результаты, данный запрос учитывает только самую первую категорию в ячейке 'category', но зато можно подсчитать общее кол-во записей, путем складывания значений 'newscount'.
id(категория) newscount
1 10
2 0
3 0
4 0
.....
10 0

А вот этот запрос работает корректно:
SQL
1
SELECT c.id, (SELECT COUNT(*) FROM dle_post p WHERE p.category REGEXP (concat('[[:<:]]',c.id,'[[:>:]]'))) AS newscount FROM dle_category c;
id(категория) newscount
1 5
2 5
3 5
4 5
.....
10 5

Но беда в том, что я не понимаю, как таким запросом узнать ещё и общее кол-во записей, так как складывание значений у 'newscount' уже не подойдет?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2016, 19:37

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как сделать правильно ? mysql и php
Кто может исправьте ошибки - что то не хвататет ) задолбался говорит ошибка в 14 строке да и не...

Как сделать красиво и правильно? ООП + PHP + MySQL
В одной из функций класса производится подключение к БД. Возможно ли реализовать что-то...

Как правильно сделать запрос в базу?
одна бд, в ней две таблицы: 1. монтаж (id, cat,name,price,desc) пример (1, 1, name, 4400,...

Как правильно сделать запрос на выборку записей
Здравствуйте уважаемые. Продолжаю разбираться в БД Access и никак не могу найти ответ на такой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.