1

无法理解如何通过第二个表中的标签信息过滤图像表。

所以我有一个包含所有基本字段的图像表:

id |
title |
userid |
timestamp |
status

我有一个标签表:

id |
imageid |
text (contains a single tag)

我想做的很简单:获取标签列表并获取包含列表中所有标签的图像列表。我只是无法绕过它。

非常感谢任何帮助,谢谢!

4

2 回答 2

2
SELECT 
    a.*
FROM 
    images a
INNER JOIN
    tags b ON a.id = b.imageid
WHERE
    b.text IN ('tag1', 'tag2', 'tag3')
GROUP BY
    a.id
HAVING
    COUNT(*) = 3

'tag1', 'tag2', 'tag3'是您的输入标签列表子句3HAVING的输入是标签列表中的标签计数。

于 2012-06-12T00:37:23.630 回答
0

假设您没有重复的标签 per imageid,您可以加入一个查询,该查询计算每个 id 的标签,将带有IN()子句的标签限制为您要搜索的列表。

然后使用一个HAVING子句,拒绝计数不等于列表中标签数量的项目(那些少于完整列表的项目):

SELECT 
 images.*
FROM 
  images 
  JOIN (
    SELECT
     imageid,
     COUNT(*) AS numtags
     /* could also be COUNT(DISTINCT text) */
    FROM tags
    /* Put only the tags you want into an IN() clause */
    WHERE text IN ('tag1,'tag2','tag3')
    GROUP BY imageid
    /* If an image has all 3 tags, COUNT(*) = 3 */
    HAVING numtags = 3
  ) tlist ON images.id = tlist.imageid
于 2012-06-12T00:22:14.207 回答