在 MySQL 中使用 INNER JOIN 后如何引用 table 的列
How can I refer to the columns of a table after I used INNER JOIN in MySQL
我以前问过这个问题,但因为太长而被删除了,所以我删除了它,对其进行了编辑,使其更短、更切题,并在此处重新post编辑:
我在 MySQL 数据库中有以下 tables,如下图所示:
我想从所有 posts
中获取字段 id
、id_user
、body
和 post_date
,其中包含一个或多个特定标签最初在 table posts
。为此,我尝试 INNER JOIN
posts
到 posts_has_tags
到 tags
并得到 posts.id
、posts.id_user
、posts.body
、posts.post_date
但我收到以下错误:
Unknown column 'posts.id' in 'field list'
我用于 INNER JOIN 的查询如下:
SELECT posts.id AS post_id, id_user, body , post_date
FROM posts INNNER JOIN posts_has_tags
ON post_id = posts_id
INNER JOIN tags
ON tags.id = tags_id
为什么 posts.id
会报错?是因为我有 INNER JOINED
和 table 吗?如果是,我该如何解决?
P.S。我知道我没有 post 查询中的 WHERE
语句,但问题不存在,所以我将其遗漏了。
您不能使用别名加入。在 join 中使用 posts.id 并更正拼写错误 INNNER JOIN
和查询语法。
SELECT posts.id AS post_id, id_user, body , post_date
FROM posts
INNER JOIN posts_has_tags ON posts.id = posts_id
INNER JOIN tags ON tags.id = tags_id;
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=e0cba7e787fa1ab61a926a38b7e98e02
当您在查询前言中处理多个 table 时,每个列都引用提供该列的 table。例如:
SELECT
posts.id AS post_id ## nb this is a "column alias"
, posts.id_user
, posts.body
, posts.post_date
FROM posts
INNER JOIN posts_has_tags ON posts.id = posts_has_tags.posts_id
INNER JOIN tags ON posts_has_tags.tags_id = tags.id
或者,为了使准备工作更容易一些,您可以声明 table 别名,然后在每个列引用前加上相关的别名,例如:
SELECT
p.id AS post_id
, p.id_user
, p.body
, p.post_date
FROM posts AS p ## nb this is a "table alias"
INNER JOIN posts_has_tags AS pt ON p.id = pt.posts_id
INNER JOIN tags AS t ON pt.tags_id = t.id
虽然您可以冒特定 colum_name 可能与一组连接的 table 唯一的风险,但如果有人更改 table,这可能并不总是正确的,因此(在我看来)始终在列前加上其 table 或别名是“良好做法”。
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=223e1f48e64513a375146ca2e8a71343
注意:您将 posts.id 别名为 post_id,但该列名称已存在于 posts_has_tags 中。这个“mixing-up”列名是一个小例子,说明为什么在编写查询时省略 table/alias 引用是有风险的。
我以前问过这个问题,但因为太长而被删除了,所以我删除了它,对其进行了编辑,使其更短、更切题,并在此处重新post编辑:
我在 MySQL 数据库中有以下 tables,如下图所示:
我想从所有 posts
中获取字段 id
、id_user
、body
和 post_date
,其中包含一个或多个特定标签最初在 table posts
。为此,我尝试 INNER JOIN
posts
到 posts_has_tags
到 tags
并得到 posts.id
、posts.id_user
、posts.body
、posts.post_date
但我收到以下错误:
Unknown column 'posts.id' in 'field list'
我用于 INNER JOIN 的查询如下:
SELECT posts.id AS post_id, id_user, body , post_date
FROM posts INNNER JOIN posts_has_tags
ON post_id = posts_id
INNER JOIN tags
ON tags.id = tags_id
为什么 posts.id
会报错?是因为我有 INNER JOINED
和 table 吗?如果是,我该如何解决?
P.S。我知道我没有 post 查询中的 WHERE
语句,但问题不存在,所以我将其遗漏了。
您不能使用别名加入。在 join 中使用 posts.id 并更正拼写错误 INNNER JOIN 和查询语法。
SELECT posts.id AS post_id, id_user, body , post_date
FROM posts
INNER JOIN posts_has_tags ON posts.id = posts_id
INNER JOIN tags ON tags.id = tags_id;
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=e0cba7e787fa1ab61a926a38b7e98e02
当您在查询前言中处理多个 table 时,每个列都引用提供该列的 table。例如:
SELECT
posts.id AS post_id ## nb this is a "column alias"
, posts.id_user
, posts.body
, posts.post_date
FROM posts
INNER JOIN posts_has_tags ON posts.id = posts_has_tags.posts_id
INNER JOIN tags ON posts_has_tags.tags_id = tags.id
或者,为了使准备工作更容易一些,您可以声明 table 别名,然后在每个列引用前加上相关的别名,例如:
SELECT
p.id AS post_id
, p.id_user
, p.body
, p.post_date
FROM posts AS p ## nb this is a "table alias"
INNER JOIN posts_has_tags AS pt ON p.id = pt.posts_id
INNER JOIN tags AS t ON pt.tags_id = t.id
虽然您可以冒特定 colum_name 可能与一组连接的 table 唯一的风险,但如果有人更改 table,这可能并不总是正确的,因此(在我看来)始终在列前加上其 table 或别名是“良好做法”。
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=223e1f48e64513a375146ca2e8a71343
注意:您将 posts.id 别名为 post_id,但该列名称已存在于 posts_has_tags 中。这个“mixing-up”列名是一个小例子,说明为什么在编写查询时省略 table/alias 引用是有风险的。