2012-11-21 110 views
1

我有三个表格,图像,标签和链接(见下表)SQL过滤通过多个标签

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

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

我想什么do允许过滤,以便用户可以选择任意数量的标签,并将图像过滤为只有选择了所有标签的图像。例如,如果用户选择“运动”,则将显示“图像NO”1,3,4和2。如果用户也选择“汽车”,则查询被细化并且仅显示“图像NO”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 

($标签)是标签的数字阵列。

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

+1

请停止编辑并删除其他人提供有益的格式化的重要的一点。如果所提供的数据和SQL格式易于阅读,那么对于某人来说,帮助您更容易。 – LOD121

+0

你可以用一个位掩码来做到这一点。如果我能想到一个具体的实现,我会附加它。 – ethrbunny

回答

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 
    [...] 
+0

感谢您回复kmkaplan,$ tags被作为一个数组传递,所以有一个未定义数量的标签,这是否仍然有效? – user1535190

+0

是的......但是你必须建立一个SQL,其中包含'link'和'tags'连接的数量与'$ tags'中的元素一样多。那就是你需要在运行时建立SQL请求。 – kmkaplan

+0

好的,谢谢,我会放弃它。 – user1535190

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]