这是我的表格的代表。 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 |
+------+------+------+------+------+------+-------+
答案 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列,这样您就不会遇到完整性问题。