我有三张这样的桌子:
图像(约10000行)

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(约30000行)
id |  tag_id  | image_id
---|----------|----------
 1 |     1    |    4
 2 |     3    |    2
 3 |     2    |    4
 4 |     1    |    1

例如,最后一个表显示id=1的标记与id=4的图像相链接。
我有两个问题,一个很简单(我想!),还有一个更难。
简单的问题
给定一个地点id,如何列出该地点id中具有图像的所有标记?例如:
给定位置,返回tagA,tagB。
难题
我想做的是选择具有特定位置I d的所有图像,并将每个图像与一个标签列表相关联,如下所示:
在加入标签信息时,选择place_id=4的all。
 filename |    tags
-----------------------
  abc.jpg | tagA
  ghi.jpg | tagA, tagB

在PHP中执行多个查询会更好吗?还是可以使用MYSQL?

最佳答案

SELECT i.place_id, t.name as tag_name
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 = 7

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 = 4GROUP BY i.filename

如果可能的话,最好避免多个查询。
*注意,GROUP_CONCAT的最大长度是由group_concat_max_len变量控制的。如果您希望得到一个连接字符串的长列表,则可能需要更改默认值。
更新
如果希望查询显示没有关联标记的图像,请将INNER JOINs更改为LEFT JOINs

10-07 14:16