gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:57:43 26 4
gpt4 key购买 nike

这是我的表格的代表。 Table 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 |
+------+------+------+------+------+------+-------+

+------+------+------+------+------+------+-------+
| 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 |
+------+------+------+------+------+------+-------+

最佳答案

您得到的结果是预期的。您应该为 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 列,这样您就不会遇到完整性问题。

关于mysql - 如何在多表连接中引用父表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25531279/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com