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

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

05.11.2016, 20:43. Показов 1369. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.11.2016, 20:43
Ответы с готовыми решениями:

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

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

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

15
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
05.11.2016, 22:09
Цитата Сообщение от bestazzz Посмотреть сообщение
Так как при пересчете новостей у категории, новость присваивается только к той категории, ID категории которой идёт первый в списке у новости.
Такая проблема решается типом связей "многие ко многим". Создается таблица с полями: id, id_news, id_category. В таблицу заносятся данные не как у вас - в одну ячейку и через запятую, а так - на один id новости один id категории.
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
05.11.2016, 22:32  [ТС]
Цитата Сообщение от 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
bestazzz, REGEXP тут излишне, можно использовать LIKE
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
06.11.2016, 10:36  [ТС]
Цитата Сообщение от 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
SQL
1
LIKE "," + ID + ","
Цитата Сообщение от bestazzz Посмотреть сообщение
А вообще, спасибо модератору, который ответил выше и порекомендовал сделать "многие ко многим". Буду реализовывать.
Это правильно.
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
06.11.2016, 11:23  [ТС]
Цитата Сообщение от 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
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  [ТС]
Цитата Сообщение от 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
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  [ТС]
Цитата Сообщение от 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
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  [ТС]
Цитата Сообщение от renat_dmitriev Посмотреть сообщение
bestazzz, Так должно работать, проверил у себя =)
Странно, всё равно показывает 0 записей в категориях
Миниатюры
Как правильно сделать запрос к MySQL для подсчета записей  
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
06.11.2016, 13:12  [ТС]
Цитата Сообщение от 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
Цитата Сообщение от 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  [ТС]
Появилась проблема по данной теме.

Допустим, есть 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.12.2016, 19:37
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru