INNER JOIN独有的列mysql

时间:2015-03-17 16:37:22

标签: php mysql database relational-database inner-join

我计划在我的网站标记系统中使用三个表,它们看起来像:

|-----------------------|
|==> 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;标签表的列!
我想出了一个改变标签列名称的解决方案,但是有没有最佳实践来解决这个问题? 感谢

3 个答案:

答案 0 :(得分:1)

我认为你应该使用别名。 例如:

SELECT p.id AS Person_Id, p.title AS Person_Title ...

您可以详细了解别名here

答案 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开始使用时。