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在两列上左连接的主要内容,如果未能解决你的问题,请参考以下文章