繁体   English   中英

Mysql在同一查询中加入2个表。 内联接还是左联接?

[英]Mysql joining 2 tables in same query. Inner join or Left join?

我正在尝试一次加入2个表,问题是我通过以下查询获取了一个空集。

select a.id, a.name, d.name, b.id, c.id from a
inner join b on a.id = b.a_id
inner join c on a.id = c.a_id
inner join d on a.d_id = d.id

我的猜测是,这是因为B表和C表都不总是与A表具有匹配的记录。

我的示例数据库如下所示:

A Table:
|id|name |d_id|
|1 |one  |1   |
|2 |two  |1   |
|3 |three|2   |

B Table:
|id|a_id|
|1 |1   |

C Table:
|id|a_id|
|1 |2   |

D Table:
|id|name|
|1 |hey |
|2 |ho  |

我对结果集中的期望如下所示:

Result-set:
|a.id|a.name|d.name|b.id|c.id
|1   |one   |hey   |1   |NULL
|2   |two   |hey   |NULL|2
|3   |three |ho    |NULL|NULL

我想选择什么

(从我的草图中排除了D表,因为我认为我对此没有问题)。 还尝试了左联接但没有运气

提前致谢!

使用左联接:

select a.id, a.name, d.name, b.id, c.id from a
inner join b on a.id = b.a_id
LEFT join c on a.id = c.a_id
LEFT join d on a.d_id = d.id

查询错过表之间的左联接:

select a.id, a.name, d.name, b.id, c.id from a
left join b on a.id = b.a_id
left join c on a.id = c.a_id
left join d on a.d_id = d.id

用你的话说,如果B和C并非总是有匹配项,则需要将它们(和仅那些)加入在一起。

SELECT a.id, a.name, d.name, b.id, c.id
FROM a
    LEFT JOIN b on (a.id = b.a_id)
    LEFT JOIN c on (a.id = c.a_id)
    JOIN d on (a.d_id = d.id);

这里A和D必须始终匹配,而来自B和C的匹配记录可能在那里,否则为NULL。

(请记住,如果添加WHERE子句或类似的内容,则B和C中所有来自不匹配行的值都将为NULL)。

测试(单击此处进行小提琴)

mysql> CREATE TABLE a
    -> ( id integer, name varchar(20), d_id integer);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO a VALUES (1, 'one', 1), (2, 'two', 1), (3, 'three', 2);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE b ( id integer, a_id integer);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO b VALUES (1, 1);
Query OK, 1 row affected (0.00 sec)

mysql> CREATE TABLE c ( id integer, a_id integer);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO c VALUES (1, 2);
Query OK, 1 row affected (0.00 sec)

mysql> CREATE TABLE d ( id integer, name varchar(20) );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO d VALUES (1, 'hey' ), (2, 'ho');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT a.id, a.name, d.name, b.id, c.id
    -> FROM a
    ->     LEFT JOIN b on (a.id = b.a_id)
    ->     LEFT JOIN c on (a.id = c.a_id)
    ->     JOIN d on (a.d_id = d.id);
+------+-------+------+------+------+
| id   | name  | name | id   | id   |
+------+-------+------+------+------+
|    1 | one   | hey  |    1 | NULL |
|    2 | two   | hey  | NULL |    1 |
|    3 | three | ho   | NULL | NULL |
+------+-------+------+------+------+

(请注意,在您的示例中c.id为2,但在您的数据中实际上为1)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM