MySQL在两列上左连接

Posted

技术标签:

【中文标题】MySQL在两列上左连接【英文标题】:MySQL left join on two columns 【发布时间】:2020-11-26 03:22:39 【问题描述】:

我有两个面板数据形式的表格,我想加入他们的 id 和 year。 表table1

id  year    col1
---------------------
1   2008    1674.9240
1   2009    1714.4611
1   2010    2470.0510
1   2011    3524.2649
1   2012    3536.4431
1   2013    3694.0000
1   2014    3812.0000
1   2015    4788.0000
1   2016    8316.0000
1   2017    8036.0000
1   2018    10899.0000
1   2019    11092.0000

table2

id  year    col2
----------------
1   2010    2
1   2013    2
1   2016    15
1   2017    6

但是右表丢失了一些数据,所以我想离开它们,这样我就可以得到这样的结果:

id  year    col1         col2
-----------------------------
1   2008    1674.9240  
1   2009    1714.4611
1   2010    2470.0510    2
1   2011    3524.2649
1   2012    3536.4431
1   2013    3694.0000    2
1   2014    3812.0000
1   2015    4788.0000
1   2016    8316.0000    15
1   2017    8036.0000    6
1   2018    10899.0000
1   2019    11092.0000

我试过像其他答案所说的那样

select a.id, a.year, a.col1, b.col2 from table1 a
    left join table2 b on a.id=b.id and a.year=b.year;

但是结果竟然是这样的

id  year    col1        col2
----------------------------
1   2010    2470.0510   2
1   2013    3694.0000   2
1   2016    8316.0000   15
1   2017    8036.0000   6

它不应该是这样的,因为另一个答案显示different result。 mysql 版本是 MySQL 8.0.22,在 macOS Big Sur 11.1 beta 上运行,带有 Apple M1 芯片。

【问题讨论】:

MySQL(和其他一些 DBMS)允许下一个语法 ON (table1.id, table1.year) = (table2.id, table2.year) 似乎很清楚。 但结果是这样的看起来真实的查询包含一些table2列未显示的WHERE条件。 【参考方案1】:

您的查询是正确的:

select a.id, a.year, a.col1, b.col2
from table1 a left join
     table2 b
     on a.id = b.id and a.year = b.year;

根据定义,这将返回a 中的所有行,即使没有匹配项。 Here 是一个 dbfiddle。

也许还有其他事情正在发生 - 例如 where 子句过滤掉不匹配的内容。

【讨论】:

感谢您的回答,但我没有添加任何where 子句,我的查询与上面显示的一样。我在 Navicat 15 中运行查询,可能是 Navicat 的问题? @FacelessMage 。 . .它应该在您编写查询时传递查询。你确定数据正确吗? 我又试了一次,发现查询工作正常,我犯了一个错误,我没有仔细检查所有结果。我的结果中有 40000+ 行,MySQL 自动对 col2 中所有带有 null 的行都远低于结果的结果进行排序。再次感谢您!

以上是关于MySQL在两列上左连接的主要内容,如果未能解决你的问题,请参考以下文章

在两个表mysql上左连接时获取最后修改日期

在具有特定条件的子查询上左连接

模式构建器 laravel 迁移在两列上是唯一的

在两列上创建约束以支持特定规则

在两列上检查唯一性的有效方法?

在两列上创建索引以检查日期是不是介于这两个列之间