【问题标题】:mysql inner join ambigious USING() field but not alwaysmysql内部加入模糊的USING()字段但并非总是如此
【发布时间】:2011-08-25 10:12:13
【问题描述】:

我最近更换了服务器,尽管我显然仍在使用 MySQL,但我认为它与我习惯的版本或设置方式不同。

最显着的影响是对我的 JOIN 查询,本质上是一些使用 INNER JOIN 的查询会引发模棱两可的列错误,而在我的最后一个服务器上,我确信代码会很好。

table1
t1_id int primary key
name text

map
t1_id int 
t2_id int 

table2
t2_id int primary key
name text

table1 与 table2 是一对多的关系。 通常,要从 table1 及其所有 table2 条目中获取一行,我会这样做:

SELECT * FROM table1 
INNER JOIN map USING(t1_id) 
INNER JOIN table2 USING(t2_id) 
WHERE table1.t1_id=1;

但是,这每次都会引发模棱两可的列错误。解决这个问题的唯一方法是使用

SELECT * FROM table1 
INNER JOIN map ON(table1.t1_id=map.t1_id) 
INNER JOIN table2 ON(map.t2_id=table2.t2_id)
WHERE table1.t1_id=1;

除了版本 5.1.56-community-log 之外,我无法告诉您有关服务器配置的太多信息,而且我相信它运行的是 Linux(可能是 Debian)。

这是我的查询有问题还是与我们使用的 MySQL 版本有关?

【问题讨论】:

    标签: mysql join ambiguous


    【解决方案1】:

    您是否尝试过以下方法:

    SELECT table1.t1_id, table1.name FROM table1 
    INNER JOIN map USING(t1_id) 
    INNER JOIN table2 USING(t2_id) 
    WHERE table1.t1_id=1;
    

    【讨论】:

    • 试过了,效果很好。直到最近才被破坏的原始查询也是如此...我将其标记为已接受,因为尽管这实际上并没有解决任何问题,但我无法重现我之前看到的错误,因此要么是人为错误,要么是有人走了并在我解决这个问题时修复了服务器。无论如何,谢谢,虽然我应该指出,加入两个表而只从一个表中获取数据并不是很有用
    【解决方案2】:

    您可以从任何表中获取任何您想要的库,只需别名(临时重命名)具有相同名称的那些:

    SELECT table1.t1_id
         , table1.name   AS t1_name
         , table2.t2_id  
         , table2.name   AS t2_name
    FROM table1 
      INNER JOIN map USING(t1_id) 
      INNER JOIN table2 USING(t2_id) 
    WHERE table1.t1_id=1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 2017-11-04
      • 2011-03-07
      • 2013-10-20
      相关资源
      最近更新 更多