如何在多表连接中引用父表?

时间:2014-08-27 15:32:22

标签: mysql sql

这是我的表格的代表。 Table a是父类(id是主键)。 b and 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  |
+------+------+------+------+------+------+-------+

OR

+------+------+------+------+------+------+-------+
| id   | name | pid  | name | id   | pid  | name  |
+------+------+------+------+------+------+-------+
| 1    | Ruby | 1    | Java | 100  | 1    | Ember |
| NULL | NULL | 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 |
+------+------+------+------+------+------+-------+

1 个答案:

答案 0 :(得分:0)

您获得的结果是预期的。你应该有一个不同的C ++ ID,这将导致你想要的结果。

您需要在B表中添加和使用C表中的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;

另外,我建议您使用自动增加的IDENTITY个ID列,这样您就不会遇到完整性问题。