简单的MySQL加入

时间:2012-06-12 00:15:58

标签: mysql join

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

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

id |
title |
userid |
timestamp |
status

我有一个标签表:

id |
imageid |
text (contains a single tag)

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

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

2 个答案:

答案 0 :(得分: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'是您的输入标记列表 3子句中的HAVING是标记列表中标记计数的输入。

答案 1 :(得分:0)

假设每个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