我有三张这样的桌子:
图像(约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 = 7SELECT 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 JOIN
s更改为LEFT JOIN
s