这是我previous question的后续内容,但略有不同,值得提出自己的问题。
我有3张这样的表:
图像(~10,000行)
id | place_id | filename
---|----------|----------
1 | 4 | abc.jpg
2 | 3 | def.jpg
3 | 4 | ghi.jpg
4 | 7 | jkl.jpg
标签(~100行)
id | name |
---|----------|
1 | tagA |
2 | tagB |
3 | tagC |
4 | tagD |
tagsToImages(~30,000行)
id | tag_id | image_id
---|----------|----------
1 | 1 | 4
2 | 3 | 2
3 | 2 | 4
4 | 1 | 1
例如,最后一个表显示id = 1的标记与id = 4的图像链接。
我想要做的是选择具有某个place_id的所有图像,并将每个图像与标签列表相关联,如下所示:
选择all with place_id = 4,同时加入标签信息。
filename | tags
-----------------------
abc.jpg | tagA
ghi.jpg | tagA, tagB
a1ex07建议执行此操作的查询,如下所示:
SELECT i.filename, GROUP_CONCAT(t.name SEPARATOR ',') AS tags
FROM images i
INNER JOIN tagsToImages tti ON (tti.image_id = i.id)
INNER JOIN tags t ON (t.id = tti.tag_id)
WHERE i.place_id = 4 GROUP BY i.filename
这太棒了,效果很好。我现在要做的是通过指定标签和地点来过滤那组结果。
我的尝试:
SELECT i.filename, GROUP_CONCAT(t.name SEPARATOR ',') AS tags
FROM images i
INNER JOIN tagsToImages tti ON (tti.image_id = i.id)
INNER JOIN tags t ON (t.id = tti.tag_id)
WHERE i.place_id = 4 AND t.id = 3 GROUP BY i.filename
几乎可以使用,但它只包含专有标记为id 3的图像,而不是包含大量标记的图像,其中一个标记为id 3。
任何人都可以帮助我吗?
答案 0 :(得分:2)
尝试在WHERE子句中放置子查询,以选择tag_id为3的任何图像 例如
WHERE i.place_id = 4 AND i.imageID IN
(
SELECT image_id
FROM tagsToImages
WHERE tag_id = 3
)
注意 - 还没有尝试过这个真实的 - 没有数据库在这台PC上进行测试。稍后会检查和更新
答案 1 :(得分:1)
我已经测试了Kris C在MySQL 5.0上的答案,它适用于我的测试数据库:
SELECT i.filename, GROUP_CONCAT(t.name SEPARATOR ',') AS tags
FROM images i
INNER JOIN tagsToImages tti ON (tti.image_id = i.id)
INNER JOIN tags t ON (t.id = tti.tag_id)
WHERE i.place_id = 4 AND i.id IN
(
SELECT image_id
FROM tagsToImages
WHERE tag_id = 1
) GROUP BY i.filename;
导致(基于您在问题中提供的数据):
+----------+------+
| filename | tags |
+----------+------+
| abc.jpg | tagA |
+----------+------+
您说这个查询对您不起作用,所以请问您正在运行哪个数据库以及哪些数据不起作用?