SQL n对n匹配多个值

Alp*_*pha 6 sql

我有一个将图像与标签匹配的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)

当然,那不是很好.任何的想法?

谢谢!

Pet*_*ang 7

这样的东西可以工作(我用id,SELECTGROUP 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个标记对其进行定义,并使用标记中不会出现的值对其进行初始化.