Как эффективно кодировать запрос в MySQL теги AND?
У меня есть общая проблема, чтобы быть уверенным. Я хотел бы сделать запрос, который находит сущность, которая имеет "n" теги. Так что в простейшем случае мы находим все сущности, которые имеют тег "эй". В более сложном случае мы находим все сущности, которые имеют все теги "привет", "привет" и "привет".
Кажется, мне нужно присоединиться к таблице тегов 3 раза и, таким образом, создать 3 разных псевдонима. В абстрактном случае мне придется сделать N разных псевдонимов. Есть ли более простой способ добиться этого?
Причина, по которой я спрашиваю, состоит в том, что мне нужно написать запрос, который делает это не только для тегов, но и для разных вещей. Таким образом, я собираюсь присоединиться к псевдонимам NxM... которые будут отстойными, чтобы написать (и настроить) запрос.
Помогите?
РЕДАКТИРОВАТЬ:
Не берите в голову. Я нашел решение:
select distinct g.id, g.description
FROM gallery g
inner join gallery_to_tag g2t_0
on g2t_0.gallery_id = g.id
inner join tag t_0
on t_0.id = g2t_0.tag_id and t_0.term = 'hi'
inner join gallery_to_tag g2t_1
on g2t_1.gallery_id = g.id
inner join tag t_1
on t_1.id = g2t_1.tag_id and t_1.term = 'hey'
3 ответа
Если вы хотите избежать объединения таблиц, вам понадобятся некоторые подзапросы. Поэтому для N тегов вам понадобится N подзапросов.
SELECT * FROM Entities
WHERE id IN (SELECT entity_id FROM tags WHERE tag = 'Hey')
AND id IN (SELECT entity_id FROM tags WHERE tag = 'Hello')
AND ...
И таким же образом вы можете выбрать сущности, которые имеют любой из желаемых тегов:
SELECT * FROM Entities
WHERE id IN (SELECT entity_id FROM tags WHERE tag = 'Hey')
OR id IN (SELECT entity_id FROM tags WHERE tag = 'Hello')
OR ...
Это то, что вы можете искать. Трудно сказать, не видя вашу схему
CREATE TEMPORARY TABLE `checktags` (
`checkme` varchar(100) NOT NULL,
KEY `checkme` (`checkme`)
) ENGINE=MyISAM;
//INSERT ALL TAGS TO CHECK
SELECT * FROM `table`
LEFT JOIN `tags` ON `table_id` = `tag_table_id`
WHERE `tag` IN (SELECT `checkme` FROM `checktags`);
Трудно дать точный ответ без схемы, однако, я полагаю, вы спрашиваете, как определить, что данный элемент имеет все запрашиваемые теги. Вы могли бы сделать что-то вроде
Select ..
From MainTable
Where Exists (
Select 1
From TagsTable
Where TagsTable.FK = MainTable.PK
And TagsTable.Tag In('hey','hi','howdy')
Having Count(*) = 3
)