[英]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.