0

我的问题如下:

我有 3 个包含内容的表格:

tableA:|ID_A|field1|field2|field3| => base table


tableB:|ID_B | ID_C |ID_A| => Mapping Table


tableC:|ID_C |FieldToGet| => Additional info field table

*重要假设:可能有多个 ID_C 值与同一个 ID_A 相关联,因此 tableB:具有以下结构:`

| ID_B | ID_C | ID_A|

|  24  |  81  |  23 |

|  25  |  11  |  23 |

|  26  | 82   |  23 |

|  27  | 42   |  24 |

|  28  | 113  | 33  |

但是如果单个 ID_A 有多个 ID_B,它们将相互跟随。

现在,我正在编写一个 php 脚本来获取某个 ID_A 所需的字段,但它失败了,因为我的子查询返回了多行:

$q = $this->dao->prepare('SELECT FieldToGet FROM table3  WHERE ID_C = ( SELECT ID_C FROM table2 WHERE ID_A =$SOME_ID_A )');

我正在寻找一个仅从列 FieldToGet (我当前的尝试)获取结果的解决方案,或者一个将使用列 FieldToGet 加入整个基表的解决方案(不确定如何使用 JOIN 操作)。

4

2 回答 2

2

加入看起来像这样,

SELECT  a.*, c.*   -- select the columns you want to get
FROM    tableA a
        INNER JOIN tableB b
            ON a.ID_A = b.ID_A
        INNER JOIN tableC c
            ON b.ID_C = c.ID_C

要全面了解联接,请访问以下链接:

于 2013-01-31T02:23:03.870 回答
1

不完全确定我了解您的需求。@JW 正确地向您展示了如何使用 INNER JOIN 将您的 3 个表连接在一起。

您的查询非常接近。而不是使用 WHERE ID_C =,您应该使用 WHERE ID_C IN ()。

SELECT FieldToGet 
FROM table3  
WHERE ID_C IN (SELECT ID_C FROM table2 WHERE ID_A =$SOME_ID_A)

我个人更喜欢使用 JOIN 而不是 IN,但根据您的数据库结构,使用 IN 实际上可以更好地执行,因为使用 JOIN 可能会返回多个结果并需要使用 DISTINCT 或 GROUP BY。这是我读到的一篇很好的文章:

http://explainextended.com/2009/06/16/in-vs-join-vs-exists/

还有一个关于SO:

https://stackoverflow.com/a/4755644/1073631

祝你好运。

于 2013-01-31T02:43:07.493 回答