INNER JOIN 唯一列 mysql

INNER JOIN unique column mysql

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

|-----------------------|
|==> 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 

除了照片 table 的 'slug, id, title' 列被标签 table![=19 的 'slug, id, title' 列替换之外,一切正常=] 我想出了一个改变标签列名称的解决方案,但是有什么最佳实践可以解决这个问题吗? 谢谢

您将不得不像这样投射其中的一些字段

SELECT t.column, s.column AS column2

否则,MySQL 确实会选择一个字段到 return(通常是最后一个具有该名称的字段),这就是您所得到的!

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

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

您可以了解更多关于别名的信息here

我们的最佳做法可能看起来需要更多工作,但我们确实为所有列名称添加了唯一前缀,这样您就不会迷失在别名中 war。

|-----------------------|
|==> 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 

更冗长,但也更具描述性,当您有很多表和非常长的连接时,效果很好……尤其是当您的智能感知启动时。