Как выбрать топики в которых содержатся ВСЕ из перечисленных тегов?

Здравствуйте уважаемы ЛСники,
Собственно вопрос:
Как выбрать топики в которых содержатся ВСЕ из перечисленных тегов?

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

avatar
Если для удаления, то примерно:

SELECT *
FROM `prefix_topic`
WHERE `topic_tags` LIKE '%tag1%' AND
WHERE `topic_tags` LIKE '%tag2%' AND ...
avatar
Эээ… Выбрать с помощью чего? Если mysql, то как-то так:

SELECT t.topic_id FROM `prefix_topic` t inner join `prefix_topic_tag` tt on t.topic_id=tt.topic_id where tt.topic_tag_text in ('tag1','tag2','tag3')
А потом по массиву ИД получать сами топики
  • kerby
  • 0
avatar
Ой, изначально писал для select *, потом поменял на select t.topic_id :)

Если нужет только topic_id то все еще проще:

SELECT topic_id from `prefix_topic_tag` where topic_tag_text in ('tag1','tag2','tag3')
avatar
да, еще перед topic_id надо бы distinct поставить, ибо может быть дубляж если теги одинаковые
avatar
Проверил — distinct не нужен. Срабатывает при первом нахождении и больше лишнего не пишет.
avatar
SELECT topic_id from `prefix_topic_tag` where topic_tag_text in ('tag1','tag2','tag3')
Это выберет топики в которых встречется ЛЮБОЙ из тегов. Не?
avatar
ой нетот запрос
avatar
SELECT t.topic_id FROM `prefix_topic` t inner join `prefix_topic_tag` tt on t.topic_id=tt.topic_id where tt.topic_tag_text in ('tag1','tag2','tag3')

вот этот запрос
avatar
Ой, я не так понял вопрос… болею и все такое. Надо подумать тогда :)

И если нужен только topic_id, то надо использовать тот запрос, который попроще, только по prefix_topic_tag
avatar
Что-то мне ничего в голову не приходит, кроме такой извращенной конструкции:

SELECT topic_id,
         GROUP_CONCAT(topic_tag_text order by topic_tag_text) val
         FROM prefix_topic_tag
         GROUP BY topic_id having val="tag1,tag2,tag3"


Т.е. надо нужные теги сначала отсортировать по алфавиту, сделать join через запятую, а потом засунуть в запрос
  • kerby
  • 0
avatar
Пока что сделал через intersect_array т.е. через foreach перебираю все теги а потом ИДшки полученных топиков пропускаю через интерсект
avatar
Имхо намного-намного затратней, чем поручить это дело mysql… можно даже еще немного убыстрить запрос, как мне кажется:

SELECT topic_id,
         GROUP_CONCAT(topic_tag_text order by topic_tag_text) val
         FROM prefix_topic_tag where topic_tag_text in ('tag1','tag2','tag3')
         GROUP BY topic_id having val="tag1,tag2,tag3"


чтобы исключить операции объединения и сравнения для топиков у которых нет ни одного нужного тега. Поле topic_tag_text индексируемое, так что все должно шустро работать.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.