2012-03-11 48 views
1

我有三个表格图像,image_tags和标签。图像表包含图像信息,标签包含标签info和image_tags包含图像和标签之间的关系,关系是多对多的。我想用AND条件(而不是IN)过滤基于多个标签的图像。多个AND在同一个连接表上coulmnn

我曾尝试:

SELECT images.* FROM images 
LEFT JOIN image_tags ON image_tags.image_id = images.id 
LEFT JOIN tags tag_0 ON image_tags.tag_id = tag_0.id 
LEFT JOIN tags tag_1 ON image_tags.tag_id = tag_1.id 
WHERE tag_0.tag = "tagme" 
AND tag_1.tag = "excellent" 
AND images.filesize > 0 
GROUP BY images.id 
ORDER BY images.posted DESC LIMIT 0, 40 

SELECT images.* FROM images 
LEFT JOIN image_tags ON image_tags.image_id = images.id 
LEFT JOIN tags ON image_tags.tag_id = tags.id 
WHERE tags.tag = "tagme" 
AND tags.tag = "excellent" 
AND images.filesize > 0 
GROUP BY images.id 
ORDER BY images.posted DESC LIMIT 0, 40 

但没有奏效它总是返回结果为零,虽然它们的存在。

回答

0

你的任何尝试都不够正确,尽管第一个更接近正确的一个。要以您试图过滤标签的方式过滤标签,您需要加入image_tags两次,并加入tags的两个实例以分开image_tags的实例。看起来你想要做内部连接而不是外部连接。这里:

SELECT i.* 
FROM images i 
    INNER JOIN image_tags it0 ON it0.image_id = i.id 
    INNER JOIN tags t0 ON t0.id = it0.tag_id 
    INNER JOIN image_tags it1 ON it1.image_id = i.id 
    INNER JOIN tags t1 ON t1.id = it1.tag_id 
WHERE i.filesize > 0 
    AND t0.tag = 'tagme' 
    AND t1.tag = 'excellent' 
ORDER BY i.posted DESC 
LIMIT 0, 40 

还有另一种方法可以做到这一点。请尝试以下操作:

SELECT i.* 
FROM images i 
    INNER JOIN image_tags it ON it.image_id = i.id 
    INNER JOIN tags t ON t.id = it.tag_id 
WHERE i.filesize > 0 
    AND t.tag IN ('tagme', 'excellent') 
GROUP BY i.id 
HAVING COUNT(DISTINCT i.tag) = 2 
ORDER BY i.posted DESC 
LIMIT 0, 40 

t.tag IN ('tagme', 'excellent')条件限制合法的标签到指定的目录和HAVING COUNT(DISTINCT i.tag) = 2确保图像已经得到了所有的人。

+0

谢谢..你是一个摇滚明星... – Hirak 2012-03-11 18:35:23

1

你的第一个查询,尽管它使用一个LEFT加入,需要在两个“塔格梅” “优秀”的tags命中,因为条件是where子句。移动状态下进入ON条款,如:

SELECT images.* FROM images 
LEFT JOIN image_tags ON image_tags.image_id = images.id 
LEFT JOIN tags tag_0 ON image_tags.tag_id = tag_0.id AND tag_0.tag = 'tagme' 
LEFT JOIN tags tag_1 ON image_tags.tag_id = tag_1.id AND tag_1.tag = 'excellent' 
WHERE images.filesize > 0 
GROUP BY images.id 
ORDER BY images.posted DESC LIMIT 0, 40 


你的第二个查询的路要走 - 它有一个不可能的条件:

WHERE tags.tag = "tagme" 
AND tags.tag = "excellent" 

tags.tag不能“塔格梅” “优秀”。

+0

感谢您如此快速的回复,但是这会返回所有结果而没有任何过滤器。任何想法? – Hirak 2012-03-11 14:39:46