2011-07-26 199 views
0

考虑下面的表格结构:帮助MySQL查询

users (user_id, ...) 
images (image_id, user_id, ...) 
tag_links (tag_id, image_id) 
tags_names (tag_id, tag_name) 

比方说,任何给定的user_id已在images表中的多个图像,并且图像具有存储在tag_links多个标签。

我怎样才能加入这些表格,以获得所有图像上任何给定的user_id所使用的所有tag_name?这些查询(连接多个表)是否缓慢并且不被推荐,或者这样做是否很常见?

谢谢。

回答

8

加入是常见的,这是它应该完成的方式。

SELECT tn.tag_name 
FROM tags_names AS tn 
INNER JOIN tag_links AS tl ON tn.tag_id=tl.tag_id 
INNER JOIN images AS i ON tl.image_id=i.image_id 
WHERE i.user_id=YOURUSERID 

你的表的设计,虽然才有意义,如果一个标签可以有一个以上的名字,如果没有就tag_links使用列name

+0

+1。如果查询不需要用户表中的任何内容(例如用户名等),那么您可以跳过对表用户的加入。如果您想删除重复的标签,您可能还需要DISTINCT标签名称。 – StuartLC

+0

thx @nonnb,错过了他不需要用户表。 – Jacob

+0

@cularis真的很感谢,但正如你所说,我的设计只有在标签可以有多个名称时才有意义,否则我应该在tag_links中添加一列。你的意思是,tag_names不是必需的,我应该有三列的tag_links表:tag_id,tag_name和image_id。但我的想法是,由于标签(例如“java”)可用于不同的图像。因此,如果我只有一张桌子,我需要为每张图片的相同标签添加新行。还是你的意思是别的? – Roman