如何在两列上左连接两个 MySQL 表?

How to Left Join two MySQL tables on two columns?

我想加入两个 table。

表 1:T1

|id|date|hits|
--- ----- ------
A1   01   2
A1   02   2
A2   02   3

表 2:T2

|id|date|runs|
--- ----- ------
A1   01   1
A2   02   0
A3   02   2

输出:

|id|date|hits|runs|
--- ----- --- ---
A1   01   2    1
A1   02   2    0
A2   02   3    0

每个id都有多个日期,每个日期有不同的hits/runs。

我试过:

SELECT t1.*,t2.*
FROM Table1 t1
LEFT JOIN Table2 t2 ON (t1.id=t2.id) AND (t1.date=t2.date);

这给了我一个巨大的 table。行数比 T1 多得多。

T2 中的行数比 T1 多,但我只关心 T1 中的日期,因此需要 LEFT JOIN。

如果没有看到数据样本和你期望输出什么,很难理解你正在尝试做什么,但我猜你没有正确理解什么 LEFT JOIN 确实如此。

T1 LEFT JOIN T2将行数限制为每行 T1 一行。

如果 T2 中有多个行与 T1 中的给定行相匹配,则联接的结果将包括 T2 中所有匹配的行。

T1 LEFT JOIN T2 所做的是从 T1 输出给定的行,即使在 T2 中有没有行匹配。

我猜您可能想要这样的东西:输出 T1 的每一行,并连接到 T2 的 最新 匹配行。如果是这样,Stack Overflow 上已经发布了很多解决方案。查找标记为 .

的问题

回复您的评论:

谢谢,我用您提供的测试数据测试了您的查询。它不会给出您显示的结果。结果是:

SELECT t1.*,t2.*
FROM Table1 t1
LEFT JOIN Table2 t2 ON (t1.id=t2.id) AND (t1.date=t2.date)
ORDER BY t1.id, t1.date;
+------+------+------+------+------+------+
| id   | date | hits | id   | date | runs |
+------+------+------+------+------+------+
| A1   | 01   |    2 | A1   | 01   |    1 |
| A1   | 02   |    2 | NULL | NULL | NULL |
| A2   | 02   |    3 | A2   | 02   |    0 |
+------+------+------+------+------+------+

演示:http://sqlfiddle.com/#!9/cece2/2

我认为你是运行一个与你上面发布的不同的查询。也许您在连接条件中混淆了 ANDOR