我计划在我的网站标记系统中使用三个表,它们看起来像:
|-----------------------|
|==> photo |
| -> id |
| -> custom_id |
| -> title |
| -> slug |
| -> date |
| -> image_url |
|-----------------------|
|==> tags |
| -> id |
| -> slug |
| -> title |
|-----------------------|
|==> tags_relation |
| -> tid | <-- this is the tags.id
| -> pid | <-- this is the photo.custom_id
|-----------------------|
因此,要获取特定标签的最新帖子,我通过以下查询使用INNER JOIN:
SELECT p.id, p.custom_id, p.title, p.slug, p.date, p.image_url, t.id, t.slug, tr.*
FROM tags t INNER JOIN
tags_relation tr
ON t.id = tr.tid INNER JOIN
photo p
ON p.custom_id = tr.pid
WHERE t.slug = 'people'
ORDER BY p.date DESC
LIMIT 20
一切都很好,除了'slug,id,title&#39;照片表的列正被“slug”,“id”,“title”和“#39;标签表的列!
我想出了一个改变标签列名称的解决方案,但是有没有最佳实践来解决这个问题?
感谢
答案 0 :(得分:1)
答案 1 :(得分:0)
你将不得不像这样投出一些这样的字段
SELECT t.column, s.column AS column2
否则,MySQL确实会选择一个字段来返回(通常是带有该名称的最后一个字段),这就是你得到的所有内容!
答案 2 :(得分:0)
我们的最佳做法可能看起来更多,但我们会为所有列名添加唯一的前缀,这样您就不会在别名大战中迷失方向。
|-----------------------|
|==> photo |
| -> photo_id |
| -> photo_custom_id |
| -> photo_title |
| -> photo_slug |
| -> photo_date |
| -> photo_image_url |
|-----------------------|
|==> tags |
| -> tag_id |
| -> tag_slug |
| -> tag_title |
|-----------------------|
|==> tags_relation |
| -> tagRelation_tid |
| -> tagRelation_pid |
|-----------------------|
哪会将您的查询更改为
SELECT photo_id, photo_custom_id, photo_title, photo_slug, photo_date, photo_image_url, tag_id, tag_slug, tags_relation.*
FROM tags INNER JOIN
tags_relation
ON tag_id = tagRelation_tid INNER JOIN
photo
ON photo_custom_id = tagRelation_pid
WHERE tag_slug = 'people'
ORDER BY photo_date DESC
LIMIT 20
更详细,但也更具描述性,当你有很多桌子和非常长的连接时,它的效果非常好......尤其是当你的intellisense开始使用时。