我有一个将图像与标签匹配的Web应用程序,我需要创建一种动态优化标签搜索结果的方法.但是,我找不到一个干净的方法来进行SQL查询,这就是我需要你帮助的地方.
我的想法是,如果我搜索标签"干净"和"狗",我将得到图像结果,标签"干净"和"狗".如果我还包含标签"little",我的结果将必须缩小到与三个标签相关联的图像.
那么,有一个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 (...)
...
)
)
Run Code Online (Sandbox Code Playgroud)
当然,那不是很好.任何的想法?
谢谢!
这样的东西可以工作(我用id,SELECT并GROUP BY使用你需要的列.
SELECT images.id
FROM images
INNER JOIN image_tags ON ...
INNER JOIN tags ON ...
WHERE tags.tag IN ( @tag1, @tag2, @tag3 )
GROUP BY images.id
HAVING COUNT(*) = @number_of_tags
Run Code Online (Sandbox Code Playgroud)
如果您的示例中有3个标签,则number_of_tags必须为3,并且连接将导致每个id匹配3行.
您可以动态创建该查询,也可以使用10个标记对其进行定义,并使用标记中不会出现的值对其进行初始化.