1

我有三个表格,图像,标签和链接(下表)

   ImageNO | TagNO
     1     | Sport
     2     | Cars
     3     | Sport
     4     | Sport
     3     | Cars
     1     | Music
     2     | Sport

(显然 TagNO 将是实际表中的数字)

我想要做的是允许过滤,以便用户可以选择任意数量的标签,并且图像将被过滤为仅选择所有标签的图像。例如,如果用户选择“运动”,则将显示“imageNO” 1、3、4 和 2。如果用户还选择了“汽车”,则查询会被细化,并且只会显示“imageNO”3 和 2。

到目前为止,我已经从网络上的示例中尝试了很多东西,这是我最接近的...

SELECT *
 FROM  images 
  LEFT JOIN links 
   ON INO = links.INO
  LEFT JOIN tags 
   ON tags.TagNO = links. TagNO
  WHERE links. TagNO
  IN ($tags)
  GROUP BY INO
  HAVING COUNT( INO ) >1

($tags) 是一个标签号数组。

问题是只有一个标签的图像永远不会显示,因为计数是 = 1 而不是 > 1。任何帮助将不胜感激,在此先感谢。

4

2 回答 2

2

我认为这个问题解决了同样的问题,并且接受的答案的方法也可能对你有用。类似于以下内容:

SELECT * 
FROM images i
JOIN links l ON l.INO = i.INO
JOIN tags t ON t.TagNO = l.TagNO
WHERE l.TagNO IN ('sports','cars')
GROUP BY i.INO
HAVING COUNT(DISTINCT t.TagNO) = 2

...重要的是COUNT(DISTINCT t.TagNO) = [number of tags]

于 2013-01-10T17:31:50.177 回答
0

您必须在同一张桌子上多次加入。为此使用别名:

SELECT * FROM images
  LEFT JOIN links AS l1 ON l1.INO = images.INO
  LEFT JOIN tags AS t1 ON t1.TagNO = l1.TagNO
  LEFT JOIN links AS l2 ON l2.INO = images.INO
  LEFT JOIN tags AS t2 ON t2.TagNO = l2.TagNO
  [...]
  WHERE t1.tagNO = $tag1
    AND t2.tagNO = $tag2
  [...]
于 2012-11-21T22:29:31.837 回答