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
更冗长,但也更具描述性,当您有很多表和非常长的连接时,效果很好……尤其是当您的智能感知启动时。
我计划为我的网站标记系统使用三个 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
更冗长,但也更具描述性,当您有很多表和非常长的连接时,效果很好……尤其是当您的智能感知启动时。