我有三张桌子,图片,标签和链接(下表)
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而不是>任何帮助都会非常感谢,提前谢谢。
答案 0 :(得分:2)
我认为this question解决了同样的问题,而accepted answer的方法也可能对您有用。有点像:
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]
答案 1 :(得分: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
[...]