【问题标题】:mySQL multiple inner joinsmySQL 多重内连接
【发布时间】:2015-03-14 20:18:22
【问题描述】:

我有两个要从中提取信息的表。

假设 table1 有以下列 (id, title, category, sub_category, sub_sub_category)

假设 table2 有以下列 (category_id, category_name)

我有一个 select 语句,到目前为止看起来如下:

SELECT
  table1.id,
  table1.title,
  table2.category_name as Cat1,
  table2.category_name as Cat2,
  table2.category_name as Cat3
FROM
  table1,
  table2
INNER JOIN table2 as c1 ON c1.category_id = table1.category
INNER JOIN table2 as c2 ON c2.category_id = table1.sub_category
INNER JOIN table2 as c3 ON c3.category_id = table1.sub_sub_category
WHERE
  table1.id = ?

这给了我一个关于 table1.category 是未知列的错误

我也试过

SELECT
  table1.id,
  table1.title,
  table2.category_name as Cat1,
  table2.category_name as Cat2,
  table2.category_name as Cat3
FROM
  table1,
  table2
WHERE table1.id = ?
AND   table1.category = table2.category_id
AND   table1.sub_category = table2.category_id
AND   table1.sub_sub_category = table2.category_id

最后一个例子至少给了我我正在寻找的列输出

(table1.id, table1.title, table1.category name, table1.sub_category name...)

因此显示表 2 中的类别名称而不是 ID。我是一名业余编码员,以前不必使用内部连接,但也许这就是我需要做的。我只是不知道如何让它输出我需要的数据。

提前感谢您的时间和考虑。

【问题讨论】:

    标签: mysql inner-join multiple-tables


    【解决方案1】:

    您的问题是from 子句中有逗号。简单的规则:永远不要在from 子句中使用逗号。始终使用显式的join 语法。

    然后,您还提到了一个额外的时间 table2,而您的 select 正在从错误的 table2 实例中提取列。

    修正后的查询如下所示:

    SELECT t1.id, t1.title,
           c1.category_name as Cat1, c2.category_name as Cat2,
           c3.category_name as Cat3
    FROM table1 t1 INNER JOIN
         table2 c1
         ON c1.category_id = t1.category INNER JOIN
         table2 c2
         ON c2.category_id = t1.sub_category INNER JOIN
         table2 c3
         ON c3.category_id = t1.sub_sub_category
    WHERE t1.id = ?;
    

    【讨论】:

      【解决方案2】:

      Ups,您这里有几个问题。 第一个 table2 只能有一个名为 category_name 的列,所以没有理由像你一样选择它三次,结果是你有三个完全相同但名称不同的列。

      第二个语法完全错误。 INNER JOIN 的语法是

      SELECT column_name(s)
      FROM table1
      INNER JOIN table2
      ON table1.column_name=table2.column_name;
      

      您还需要在两个表中都有列,通常是外键,并且该列将用于匹配数据。我猜在您的情况下,它应该是第二个表中的 category_id,而在第一个表中,您命名为 category 的列(它应该重命名为 category_id,这样更方便)...

      所以如果理解正确,你想从第一个表中选择 id、title 和第二个表中的 category_name,你可以这样做:

      SELECT table1.id, table1.title, table2.category_name
      FROM table1
      INNER JOIN table2
      ON table1.category_id = table2.category_id;
      

      对您的友好建议是,在您继续您所做的任何事情之前,先查找一些在线资源并了解更多有关这方面的信息……

      【讨论】:

      • 感谢您抽出宝贵时间发帖。请意识到我是一个业余爱好者,并且自学成才。我可以查找示例并对它们进行逆向工程......但是使用 PHP 比使用 mySQL 做得更好。上面的语句有效,但它不能解决在一个语句中获取多个类别的名称的问题。我可以从 table2 中获取带有 where 子句的单个字段的名称。我遇到的问题是将 table2 中的名称与 table1 中的 3 个字段连接起来。我知道我需要为每列提供唯一 ID,这就是为什么它在 select 语句中显示 table2.category_name 3 次。
      • 不客气,我不太明白,在第一个表中,category_id 存储在列 category、sub_category 等形成第二个表中,所以我没有多大帮助......但我'很高兴 Gordon 解决了你的问题......我希望下次我会更有帮助:) GL......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      相关资源
      最近更新 更多