在MYSQL中加入3个表并进行过滤

时间:2011-02-26 17:43:30

标签: mysql

这是我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。

任何人都可以帮助我吗?

2 个答案:

答案 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 |
+----------+------+

您说这个查询对您不起作用,所以请问您正在运行哪个数据库以及哪些数据不起作用?