Mysql 如何在多表联接中引用父表?
这是我的表的一个表示形式。表a是一种作为主键的父id。b和c的行数不同,其pid是对父级的引用Mysql 如何在多表联接中引用父表?,mysql,sql,Mysql,Sql,这是我的表的一个表示形式。表a是一种作为主键的父id。b和c的行数不同,其pid是对父级的引用 mysql> select * from a; +------+------+ | id | name | +------+------+ | 1 | Ruby | +------+------+ mysql> select * from b; +------+------+ | pid | name | +------+------+ | 1 | Java | | 1
mysql> select * from a;
+------+------+
| id | name |
+------+------+
| 1 | Ruby |
+------+------+
mysql> select * from b;
+------+------+
| pid | name |
+------+------+
| 1 | Java |
| 1 | C++ |
+------+------+
mysql> select * from c;
+------+------+-------+
| id | pid | name |
+------+------+-------+
| 100 | 1 | Ember |
+------+------+-------+
我正在努力实现以下任一目标:
+------+------+------+------+------+------+-------+
| id | name | pid | name | id | pid | name |
+------+------+------+------+------+------+-------+
| 1 | Ruby | 1 | Java | 100 | 1 | Ember |
| 1 | Ruby | 1 | C++ | NULL | NULL | NULL |
+------+------+------+------+------+------+-------+
或
左外连接不能产生我想要的结果,因为第二个连接是在第一个连接的结果上完成的,因此产生了2行
mysql> select *
-> from A
-> left outer join B ON a.id = b.pid
-> left outer join C ON a.id = c.pid;
+------+------+------+------+------+------+-------+
| id | name | pid | name | id | pid | name |
+------+------+------+------+------+------+-------+
| 1 | Ruby | 1 | Java | 100 | 1 | Ember |
| 1 | Ruby | 1 | C++ | 100 | 1 | Ember |
+------+------+------+------+------+------+-------+
你得到的结果是意料之中的。你应该有一个不同的ID,C++,这将导致你想要的结果。 您需要在B表中添加将在C表中用作外键的and ID列,以便筛选结果 修复此数据库设计问题将帮助您解决此问题,因为您当前的设计存在缺陷 生成的查询应如下所示:
SELECT *
FROM A
LEFT OUTER JOIN B ON A.id = B.pid
LEFT OUTER JOIN C ON A.id = B.pid AND C.newForeignKeyId=B.newId;
此外,我建议使用自动递增的标识id列,这样您就不会遇到完整性问题。如果所有内容的id都为1,那么为什么Ember与C++/Ruby不相关?为了清晰起见,我修改了表C中id的值。@Bala C表中id的更改不会改变任何内容。你需要有一个从C到B的外键,才能达到你想要的结果。我相信Tables的设计看起来是有缺陷的。但这些表是临时表,内容是从消息队列上的多条消息读取的。
SELECT *
FROM A
LEFT OUTER JOIN B ON A.id = B.pid
LEFT OUTER JOIN C ON A.id = B.pid AND C.newForeignKeyId=B.newId;