在 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 中获取字段 idid_userbodypost_date,其中包含一个或多个特定标签最初在 table posts。为此,我尝试 INNER JOIN postsposts_has_tagstags 并得到 posts.idposts.id_userposts.bodyposts.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 引用是有风险的。