Как эффективно кодировать запрос в 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
                )
Другие вопросы по тегам