Выборка записей из базы по списку меток, заданных в другой таблице?
В MySQL есть таблица с записями, так же в отдельной таблице лежат «id записи» — «id тега», которые обозначают, какие теги имеет обозначенная запись.
Необходимо выбрать записи по заданным пользователем тегам. При этом тегов в запросе может быть несколько и в таком случае выбираются все записи, содержащие хотя бы один из перечисленных в запросе тегов.
Вариант, при котором для каждой метки создается отдельное поле в таблице записи не подходит, т.к. при необходимости требуется добавить новую метку без изменений в коде sql-запроса.
Подскажите, каким sql-запросом сделать такую выборку?
SELECT r.*
FROM Records r
INNER JOIN Record_Tag rt ON rt.record_id = r.id
INNER JOIN Tag t ON t.id = rt.tag_id
WHERE t.name IN ('tag1','tag2','tag3,...,'tagN')
Выберет все записи (не уникальные) по тегам, для того чтобы выьрать уникальные нужно добавить DISTINCT, или группировку, смотря как вы собираетесь использовать эти данные.
SELECT * FROM Record
WHERE id IN (
SELECT rt.record_id FROM Record_Tag rt
INNER JOIN Tag t ON t.id = rt.tag_id
WHERE t.name IN ('tag1','tag2','tag3,...,'tagN')
Можно вложенным запросом, что бы избежать дублирования.