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

12
[Удален]
#11
ivan-lev:
Эм.. а можно мне запись, которая соответствует tag_id 37 и 40 этим запросом... или 26 и 4 🍿

SELECT `entry_id` FROM (SELECT `entry_id` , CONCAT(CONCAT(',', GROUP_CONCAT( `tag_id` )), ',') AS `tag_id` FROM `entry_tags` GROUP BY `entry_id`) AS tmp WHERE (`tag_id` LIKE '%,37,%' AND `tag_id` LIKE '%,40,%')

---------- Добавлено 03.08.2012 в 13:24 ----------

Polimer:
А что, не так надо? Значит, надо найти все 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)

Надо чтобы эти теги у записи были, но могут быть и другие. Тот запрос, что я написал первым выдает только те записи, у которых только нужные теги и только они.

IL
На сайте с 20.04.2007
Offline
435
#12
pa5htet:
Мда, ошибочка вышла, выбирает только те записи, которые имеют все теги и только их.

Не-не.. там ещё интереснее.. есть разница между 26, 4 и 4, 26. А для трёх тэгов комбинаций чуть поболе будет.. Можно, конечно по ID-шнику и там и там сортировать. Но проблему лишних тэгов всё равно не решает

---------- Добавлено 03.08.2012 в 13:28 ----------

WHERE (`tag_id` LIKE '%,37,%' AND `tag_id` LIKE '%,40,%')

почти как здесь (разве что по ссылке нет деталей.. в смысле, 4,24 и 40 будут LIKE %4% но там и кавычек нет.. главное - идея )

p.s. Кстати, можно замерять, что лучше.. N LIKE-ов или N JOIN-ов по ключу :) (для ключей не забыть индексы проставить)

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
[Удален]
#13
ivan-lev:
Не-не.. там ещё интереснее.. есть разница между 26, 4 и 4, 26. А для трёх тэгов комбинаций чуть поболе будет.. Можно, конечно по ID-шнику и там и там сортировать. Но проблему лишних тэгов всё равно не решает

А второй вариант как? Некрасиво конечно, но на первый взгляд именно то что надо.

IL
На сайте с 20.04.2007
Offline
435
#14
ivan-lev:
в смысле, 4,24 и 40 будут LIKE %4% но там и кавычек нет.. главное - идея

Упс.. кавычки есть.. идея тоже.. только разделителя нет =)

[Удален]
#15
ivan-lev:

почти как здесь (разве что по ссылке нет деталей.. в смысле, 4,24 и 40 будут LIKE %4% но там и кавычек нет.. главное - идея )

p.s. Кстати, можно замерять, что лучше.. N LIKE-ов или N JOIN-ов по ключу :) (для ключей не забыть индексы проставить)

Не, там нет (или я не допер) фишки в GROUP_CONCAT, без которой LIKE в данном случае бесполезен.

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

Когда же наступит тот день, когда вопросы будут формироваться внятно?

Варианты:

1. Каждая найденная запись имеет все нужные теги и только их:

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 = кол-во тегов в условии без повторов

2. Каждая найденная запись имеет все нужные теги и любые другие:

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 = кол-во тегов в условии без повторов

3. Каждая найденная запись имеет хотя бы один нужный тег и любые другие:

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)

Есть еще 4-й вариант: Каждая найденная запись имеет один или несколько или все нужные теги, но при этом не содержит других тегов, не относящихся к перечню нужных. Но мне о нем лень думать.

Программные решения для бизнеса. (http://frontsoft.ru/) На заказ. Дорого.
[Удален]
#17
Polimer:
Когда же наступит тот день, когда вопросы будут формироваться внятно?

Ну, как смог. Спасибо, INNER JOIN там лишний, но в остальном работает =)

12

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