Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » MySQL » Как составить sql запрос для получения новостей принадлежащих одновременно нескольким определенным категориям?

Как составить sql запрос для получения новостей принадлежащих одновременно нескольким определенным категориям?


     22.03.2022    Все вопросы » MySQL    224

вопрос
Добрый день.
Для вывода новостей из нескольких определенных категорий, в DLE используется поиск по таблице dle_post_extras_cats и mysql запрос имеет вид:
SELECT DISTINCT(" . PREFIX . "_post_extras_cats.news_id) FROM " . PREFIX . "_post_extras_cats WHERE cat_id IN ('" . $get_cats . "')

Однако такой вариант, выводит новости, даже если новость содержит всего одну категорию из нескольких перечисленных.
Подскажите пожалуйста, как в данном случае переписать mysql запрос так, что бы получить новости, которые находятся сразу во всех перечисленные категории?
То есть, например что бы найти все новости, каждая из которых состоит одновременно в категориях с id "4, 15, 28", а не только в одной из них.

Ответа пока нет


14 комментариев

dj-avtosh
PHP-developer

dj-avtosh - 22 марта 2022 10:33 -

В теории так

SELECT DISTINCT(" . PREFIX . "_post_extras_cats.news_id) FROM " . PREFIX . "_post_extras_cats WHERE cat_id = " . implode(' AND cat_id = ', explode(',', $get_cats))

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

Kane
Юзер

Kane - 22 марта 2022 12:07 -

Спасибо за ответ.
Такой вариант не находит ни одной записи, раньше с DISTINCT не доводилось сталкиваться, не пойму что не так.
Вот казалось бы, элементарная задача, а приходится голову ломать.

dj-avtosh
PHP-developer

dj-avtosh - 22 марта 2022 12:24 -

SELECT DISTINCT news_id FROM (SELECT news_id, cat_id FROM " . PREFIX . "_post_extras_cats WHERE cat_id = " . implode(' AND cat_id = ', explode(',', $get_cats))) a

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

Kane
Юзер

Kane - 22 марта 2022 13:15 -

Ничего не находит. Но оно и не должно, ведь в подзапросе используется оператор AND, то есть "WHERE cat_id = 4 AND cat_id = 15 AND cat_id = 28", а у одной записи, cat_id не может одновременно равняться нескольким значениям. Пробовал заменить на OR, но тогда результат выборки как у изначального запроса, выводит новости которые принадлежат хотя бы одной из категорий.

По идеи, сначала нада получить выборку айдишников всех новостей с данными категориями, с помощью подзапроса, как в вашем втором варианте, только с оператором OR
SELECT news_id, cat_id FROM dle_post_extras_cats WHERE cat_id = 4 OR cat_id = 15 OR cat_id = 28
И потом результаты, как то сгруппировать, или отсеять те id новостей, у которых нет всех нужных категорий.
Но как это сделать не понимаю.

dj-avtosh
PHP-developer

dj-avtosh - 22 марта 2022 13:35 -

Согласен. Моя ошибка:

SELECT DISTINCT news_id FROM  (SELECT news_id, cat_id FROM " . PREFIX . "_post_extras_cats WHERE cat_id IN ('" . $get_cats . "') GROUP BY cat_id HAVING COUNT(`news_id`) = " . count(explode(',', $get_cats)) . ") a

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

Kane
Юзер

Kane - 25 марта 2022 15:49 -

Большое спасибо, то что нужно!
В коде пара ошибок, но саму идею я понял.
Если кому то в будущем понадобится, вот рабочий вариант:
SELECT DISTINCT news_id FROM  (SELECT COUNT(news_id) as count_news_id, news_id, cat_id FROM dle_post_extras_cats WHERE cat_id IN (" . $get_cats . ") GROUP BY news_id HAVING COUNT(`count_news_id`) = " . count(explode(',', $get_cats)) . ") a

dj-avtosh
PHP-developer

dj-avtosh - 25 марта 2022 16:10 -

подозреваю, что это вряд ли работает

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

Kane
Юзер

Kane - 25 марта 2022 18:50 -

удален.

dj-avtosh
PHP-developer

dj-avtosh - 25 марта 2022 18:55 -

не тупите, группировать нужно по news_id, но считать нужно количество категорий (cat_id) внутри группы, и оно должно быть ровно кол-во категорий через запятую. Тестируйте на больших данных.

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 25 марта 2022 18:55 -

я вам внтзу скинул верный запрос, откройте глаза.

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 25 марта 2022 18:58 -

графически говоря получается так:

news_id = 1
- cat_id
- cat_id
- cat_id

news_id = 2
- cat_id
- cat_id
- cat_id

Теперь найдите в чем ваша ошибка

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 25 марта 2022 17:05 -

Я думаю правильно вот так:

select news_id
from dle_post_extras_cats
where cat_id in ('" . $get_cats . "')
group by news_id
having count(cat_id) = " . count(explode(',', $get_cats))

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

Kane
Юзер

Kane - 25 марта 2022 16:00 -

Подскажите еще пожалуйста, а как получить обратный результат? То есть новости, у которых одновременно отсутствует несколько определенных категорий. По идеи, тут уже нужен какой то другой принцип, чем в первом варианте, но какой что то пока не соображу.

dj-avtosh
PHP-developer

dj-avtosh - 25 марта 2022 17:18 -

Как-то так:

select distinct news_id from dle_post_extras_cats pe1
where not exists (
select news_id
from dle_post_extras_cats pe2
where cat_id in ('" . $get_cats . "') and pe1.news_id = pe2.news_id
group by news_id
having count(cat_id) = " . count(explode(',', $get_cats)))

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх