SQL 选择具有特定孩子的所有兄弟姐妹

Myk*_*623 5 mysql

我有一个简单的父子层次结构,使用两个表:组件(父项)和零件(子项)。装配体由一个或多个零件组成。

| 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

JGA*_*JGA 4

在 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)