无法理解如何通过第二个表格中的标记信息过滤图像表。
所以我有一个包含所有基本字段的图像表:
id |
title |
userid |
timestamp |
status
我有一个标签表:
id |
imageid |
text (contains a single tag)
我想做的很简单:获取标签列表并获取包含列表中所有标签的图像列表。我无法绕过它。
非常感谢任何帮助,谢谢!
答案 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