Mysql 如何在多表联接中引用父表?

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

这是我的表的一个表示形式。表a是一种作为主键的父id。b和c的行数不同,其pid是对父级的引用

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;