SQL. Выбрать записи с заданными тегами

12
[Удален]
1751

Есть табличка с записями entry:

`id` BIGINT NOT NULL AUTO_INCREMENT,

`title` VARCHAR( 255 ),

`desc` VARCHAR( 255 ),

и т.д.

Есть табличка с тегами tags:

`id` BIGINT NOT NULL AUTO_INCREMENT,

`title` VARCHAR( 255 ),

и т.д.

Каждой записи соответсвуют несколько тегов, соответственно есть еще одна табличка entry_tags:

`id` BIGINT NOT NULL AUTO_INCREMENT,

`entry_id` BIGINT NOT NULL,

`tag_id` BIGINT NOT NULL,

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

Ну и вопрос: как из таблички entry_tags выбрать эти самые записи с заданными тегами?

maldivec
На сайте с 04.11.2008
Offline
160
#1

Не совсем понимаю что нужно, но может все же

... WHERE 'tag_id' IN (1,2,4,5453) ....

[Удален]
#2
maldivec:
Не совсем понимаю что нужно, но может все же

... WHERE 'tag_id' IN (1,2,4,5453) ....

Этот запрос выберет все записи, в которых есть хотя-бы один тег, а надо только те, в которых они все есть.

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#3

ну AND используйте

LIKE '%1%' AND LIKE '%2%' LIKE '%3%'

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
[Удален]
#4
LEOnidUKG:
ну AND используйте
LIKE '%1%' AND LIKE '%2%' LIKE '%3%'

Одна строка - один тег, AND соответственно выдаст нулевой результат.

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#5

Вы сами придумали структуру сайта, а теперь спрашиваете как с ней вам работать?

[Удален]
#6
LEOnidUKG:
Вы сами придумали структуру сайта, а теперь спрашиваете как с ней вам работать?

Странный вопрос. Форум то для них и нужен.

Это достаточно типичная структура, к достоинствам которой можно отнести простоту БД, а к недостаткам - сложность вот таких замысловатых запросов.

Кстати, рабочий вариант:

SELECT `entry_id` FROM (SELECT `entry_id` , GROUP_CONCAT( `tag_id` ) AS `tag_id` FROM `entry_tags` GROUP BY `entry_id` ) AS tmp WHERE `tag_id` = '40,26,21,39,37,43,4'

Недостаток его - поле `tag_id` должно быть текстовое.

Polimer
На сайте с 01.09.2006
Offline
84
#7

Есть немного быдолватый, но рабочий способ. Показываю примерное направление, код не проверял:

SELECT e.id

FROM entry e INNER JOIN entry_tags et ON (et.entry_id = e.id)
WHERE et.tag_id in (1, 5, 10, 100, 1234)
GROUP BY e.id
HAVING count(et.tag_id) = 5 -- здесь 5 = кол-во тегов в условии без повторов
Программные решения для бизнеса. (http://frontsoft.ru/) На заказ. Дорого.
IL
На сайте с 20.04.2007
Offline
435
#8
pa5htet:

Кстати, рабочий вариант:

SELECT `entry_id` FROM (SELECT `entry_id` , GROUP_CONCAT( `tag_id` ) AS `tag_id` FROM `entry_tags` GROUP BY `entry_id` ) AS tmp WHERE `tag_id` = '40,26,21,39,37,43,4'

Эм.. а можно мне запись, которая соответствует tag_id 37 и 40 этим запросом... или 26 и 4 🍿

А правильное решение (для указанной структуры) - либо N (количество нужных тэгов) раз INNER JOIN-ить с entry_tags по entry_id

либо делать несколько запросов - выборка из выборки.

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
[Удален]
#9
ivan-lev:
Эм.. а можно мне запись, которая соответствует tag_id 37 и 40 этим запросом... или 26 и 4 🍿

SELECT `entry_id` FROM (SELECT `entry_id` , GROUP_CONCAT( `tag_id` ) AS `tag_id` FROM `entry_tags` GROUP BY `entry_id` ) AS tmp WHERE `tag_id` = '37, 40' или `tag_id` = '26, 4'

Мда, ошибочка вышла, выбирает только те записи, которые имеют все теги и только их.

Polimer
На сайте с 01.09.2006
Offline
84
#10
pa5htet:
выбирает только те записи, которые имеют все теги и только их.

А что, не так надо? Значит, надо найти все entry_id, ссылающиеся на любой из тегов? Тогда как-то так:

SELECT DISTINCT e.id

FROM entry e INNER JOIN entry_tags et ON (et.entry_id = e.id)
WHERE et.tag_id in (1, 5, 10, 100, 1234)
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий