我有一个简单的父子层次结构,使用两个表:组件(父项)和零件(子项)。装配体由一个或多个零件组成。
| AID | A_NAME |
|-----|------------|
| 1 | Assembly X |
| 2 | Assembly Y |
| 3 | Assembly Z |
| PID | P_NAME | AID |
|-----|--------|-----|
| 1 | Part A | 1 |
| 2 | Part B | 1 |
| 3 | Part C | 1 |
| 4 | Part D | 1 |
| 5 | Part A | 2 |
| 6 | Part B | 2 |
| 7 | Part C | 3 |
| 8 | Part D | 3 |
Run Code Online (Sandbox Code Playgroud)
要显示组件及其零件的完整列表,我可以运行以下 SQL 查询:
SELECT a.*, p.*
FROM assemblies a
LEFT JOIN parts p USING (AID);
Run Code Online (Sandbox Code Playgroud)
它返回:
| AID | A_NAME | PID | P_NAME |
|-----|------------|-----|--------|
| 1 | Assembly X | 1 | Part A |
| 1 | Assembly X | 2 | Part B |
| 1 | Assembly X | 3 | Part C |
| 1 | Assembly X | 4 | Part D |
| 2 | Assembly Y | 5 | Part A |
| 2 | Assembly Y | 6 | Part B |
| 3 | Assembly Z | 7 | Part C |
| 3 | Assembly Z | 8 | Part D |
Run Code Online (Sandbox Code Playgroud)
现在,如果我只想返回包含特定零件(例如“B 部分”)的程序集,那么我可以运行以下查询:
SELECT a.*, p.*
FROM assemblies a
LEFT JOIN parts p USING (AID)
WHERE p.P_NAME='Part B';
Run Code Online (Sandbox Code Playgroud)
返回:
| AID | A_NAME | PID | P_NAME |
|-----|------------|-----|--------|
| 1 | Assembly X | 2 | Part B |
| 2 | Assembly Y | 6 | Part B |
Run Code Online (Sandbox Code Playgroud)
然而,我真正想看到的是所有兄弟部分*:
| AID | A_NAME | PID | P_NAME |
|-----|------------|-----|--------|
| 1 | Assembly X | 1 | Part A |*
| 1 | Assembly X | 2 | Part B |
| 1 | Assembly X | 3 | Part C |*
| 1 | Assembly X | 4 | Part D |*
| 2 | Assembly Y | 5 | Part A |*
| 2 | Assembly Y | 6 | Part B |
Run Code Online (Sandbox Code Playgroud)
关于如何实现这一目标有什么想法吗?也就是说,对于给定零件,返回其所属的程序集以及程序集中的所有其他零件。
我正在使用 MySQL,如果有帮助的话,这里有一个sqlfiddle。
在 WHERE 中,您可以简单地过滤组件 id 等于“Part B”的组件 id 的零件
SELECT a.*, p.*
FROM assemblies a
LEFT JOIN parts p USING (AID)
WHERE p.AID IN
(
SELECT AID FROM parts WHERE P_NAME='Part B'
);
Run Code Online (Sandbox Code Playgroud)