讲解mysql left join

问题描述 投票:0回答:1
CREATE TABLE tab1 (
  id1 int NOT NULL,
  field11 int NOT NULL,
  field12 date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

INSERT INTO tab1 (id1, field11, field12) VALUES
(1, 11, '2024-07-10'),
(2, 11, '2024-07-10'),
(3, 11, '2024-07-10'),
(4, 12, '2024-07-11'),
(5, 12, '2024-07-11'),
(6, 12, '2024-07-11');

CREATE TABLE tab2 (
  id2 int NOT NULL,
  field21 int NOT NULL,
  field22 date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

INSERT INTO tab2 (id2, field21, field22) VALUES
(1, 11, '2024-07-01'),
(2, 11, '2024-07-01'),
(3, 11, '2024-07-01'),
(4, 22, '2024-07-02'),
(5, 22, '2024-07-02'),
(6, 22, '2024-07-02');
select * 
from tab1 t1
left join tab2 t2 on t1.field11 = t2.field21;

我得到了以下结果:

+-----+---------+------------+------+---------+------------+
| id1 | field11 | field12    | id2  | field21 | field22    |
+-----+---------+------------+------+---------+------------+
|   1 |      11 | 2024-07-10 |    3 |      11 | 2024-07-01 |
|   1 |      11 | 2024-07-10 |    2 |      11 | 2024-07-01 |
|   1 |      11 | 2024-07-10 |    1 |      11 | 2024-07-01 |
|   2 |      11 | 2024-07-10 |    3 |      11 | 2024-07-01 |
|   2 |      11 | 2024-07-10 |    2 |      11 | 2024-07-01 |
|   2 |      11 | 2024-07-10 |    1 |      11 | 2024-07-01 |
|   3 |      11 | 2024-07-10 |    3 |      11 | 2024-07-01 |
|   3 |      11 | 2024-07-10 |    2 |      11 | 2024-07-01 |
|   3 |      11 | 2024-07-10 |    1 |      11 | 2024-07-01 |
|   4 |      12 | 2024-07-11 | NULL |    NULL | NULL       |
|   5 |      12 | 2024-07-11 | NULL |    NULL | NULL       |
|   6 |      12 | 2024-07-11 | NULL |    NULL | NULL       |
+-----+---------+------------+------+---------+------------+
12 rows in set (0.00 sec)

但我期望以下结果:

+-----+---------+------------+------+---------+------------+
| id1 | field11 | field12    | id2  | field21 | field22    |
+-----+---------+------------+------+---------+------------+
|   1 |      11 | 2024-07-10 |    1 |      11 | 2024-07-01 |
|   2 |      11 | 2024-07-10 |    2 |      11 | 2024-07-01 |
|   3 |      11 | 2024-07-10 |    3 |      11 | 2024-07-01 |
|   4 |      12 | 2024-07-11 | NULL |    NULL | NULL       |
|   5 |      12 | 2024-07-11 | NULL |    NULL | NULL       |
|   6 |      12 | 2024-07-11 | NULL |    NULL | NULL       |
+-----+---------+------------+------+---------+------------+

我的期望基于此文档(来自https://www.w3schools.com/mysql/mysql_join_left.asp):

LEFT JOIN 关键字返回左表中的所有记录 (表1),以及右表中的匹配记录(如果有) (表2)。

enter image description here

结果数据集必须是仅与图片上的绿色圆圈对应的记录。

左连接如何工作?

mysql join left-join
1个回答
-1
投票

是的,您是对的,LEFT JOIN 关键字返回左表中的所有记录,以及右表中的匹配记录。 就像您在 't1.field11 = t2.field21' 上执行左连接一样 - 将返回左表 (t1) 中的所有行,并且 tab1 中 field11 = '11' 的行将与 tab2 中 field21 = '11' 的所有行连接。 由于 tab2 中 field21 = 11 有 3 个匹配行,因此 tab1 中 field11 = 11 的每一行都将与这 3 行中的每一行匹配,从而导致多个组合。其余全部将为 NULL。

© www.soinside.com 2019 - 2024. All rights reserved.