在MYSQL中连接3个表并进行过滤

在MYSQL中连接3个表并进行过滤,mysql,Mysql,这是我的后续文章,但略有不同,值得提出自己的问题 我有3张这样的桌子: 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 图像

这是我的后续文章,但略有不同,值得提出自己的问题

我有3张这样的桌子:

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
图像(约10000行)

标记(~100行)

标记图像(约30000行)

例如,最后一个表显示id=1的标记与id=4的图像链接

我想做的是选择具有特定位置id的所有图像,并将每个图像与标签列表相关联,如下所示:

选择place_id=4的all,同时加入标签信息

 filename |    tags    
-----------------------
  abc.jpg | tagA       
  ghi.jpg | tagA, tagB 
建议执行此操作的查询如下所示:

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


有人能帮我吗?

尝试在WHERE子句中放置一个子查询,以选择标记id为3的任何图像 e、 g


注意-尚未真正尝试此操作-此电脑上没有可用于测试的数据库。稍后将检查并更新

尝试在WHERE子句中放置子查询,以选择标记id为3的任何图像 e、 g


注意-尚未真正尝试此操作-此电脑上没有可用于测试的数据库。稍后将检查并更新

我已经在MySQL 5.0上测试了Kris C的答案,它在我的测试数据库中运行:

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;
这导致(根据您在问题中提供的数据):


您说过此查询不适用于您,那么您能说出您正在运行的数据库以及不适用的具体数据吗?

我已经在MySQL 5.0上测试了Kris C的答案,它适用于我的测试数据库:

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;
这导致(根据您在问题中提供的数据):


您说过此查询不适用于您,那么您能说出您正在运行的数据库以及不适用的具体数据吗?

这似乎对结果集没有任何影响,这似乎很奇怪。这似乎对结果集没有任何影响,这似乎有点奇怪。谢谢——我又玩了一点,问题是如果有多个标签与一个文件关联,那么只会显示您筛选的那个标签。给出的数据不能很好地反映这一点。我会把你的回答标记为接受,因为你需要声誉!谢谢–我已经讨论了更多,问题是如果有多个标记与文件关联,则只显示您筛选的标记。给出的数据不能很好地反映这一点。我会把你的回答标记为接受,因为你需要声誉!
WHERE i.place_id = 4 AND i.imageID IN 
(
    SELECT image_id 
    FROM tagsToImages 
    WHERE tag_id = 3
)
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 |
+----------+------+