我有一个将图像与标签匹配的Web应用程序,我需要创建一种动态优化标签搜索结果的方式。但是,我无法找到一个干净的方式来进行SQL查询,而这正是我需要您的帮助的地方。SQL n对n匹配多个值
这个想法是,如果我搜索标签“干净”和“狗”,我将有图像结果,同时具有标签“干净”和“狗”。如果我还包含“小”标签,我的结果将不得不缩小到具有三个标签关联的图像。
因此,有一个N对N的关系,这是做到这一点的正确方法?
我自然的方法是生成代码这样的事情,但我肯定不喜欢往哪里去:
SELECT images.*
FROM images
INNER JOIN image_tags ON ...
INNER JOIN tags ON ...
WHERE tags.tag = @tag1
AND EXISTS
(
SELECT 1
FROM images
INNER JOIN image_tags ON ...
INNER JOIN tags ON ...
WHERE tag = @tag2
AND EXISTS
(
SELECT 1
FROM images
INNER JOIN image_tags ON ...
INNER JOIN tags ON ...
WHERE tag = @tag3
AND EXISTS (...)
...
)
)
当然,这不是真的很好。任何想法?
谢谢!
这对于允许/需要的标签数量非常严格,并且对每个指定的标签而不是每个图像都返回一行。 – 2010-01-04 17:02:05
'GROUP BY'应该避免为每个标签返回一行。我编辑了这个问题,以显示它如何与动态数量的标签一起工作。 – 2010-01-04 17:17:45
非常感谢!我没有想过用HAVING COUNT()重新检查结果。 – Alpha 2010-01-05 14:11:56