0

我有一个常见的问题可以确定。我想进行查询以查找具有“n”标签的实体。所以在最简单的情况下,我们会找到所有带有“嘿”标签的实体。在更复杂的情况下,我们会找到所有具有“hey”、“hi”和“howdy”标签的实体。

看来我必须加入标签表 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'
4

3 回答 3

0

没有模式很难提供准确的答案,但是,我相信您在问如何确定给定项目是否具有正在查询的所有标签。你可以做类似的事情

Select ..
From MainTable
Where Exists    (
                Select 1
                From TagsTable
                Where TagsTable.FK = MainTable.PK
                    And TagsTable.Tag In('hey','hi','howdy')
                Having Count(*) = 3
                )
于 2010-07-05T18:11:27.273 回答
0

这是您可能正在寻找的东西。不看你的架构就很难说

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`);
于 2010-07-05T18:03:19.470 回答
0

如果您想避免连接表,您将需要一些子查询。所以对于 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 ...
于 2010-07-05T18:21:19.360 回答