我的问题是:
我有 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相关联这样表 B: 具有以下结构:'
| 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所需的 fied,但它失败了,因为我的子查询返回多行。
$q = $this->dao->prepare('SELECT FieldToGet FROM table3 WHERE ID_C = ( SELECT ID_C FROM table2 WHERE ID_A =$SOME_ID_A )');
我正在寻找一个仅从 columm FieldToGet 获取结果的解决方案(我当前的尝试)或将连接整个基表的解决方案,列为 FieldToGet(不确定如何使用 JOIN opearation)。
连接将如下所示,
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
要充分了解联接,请访问以下链接:
- SQL 联接的可视化表示形式
不完全确定我是否了解您的需求。 @JW正确地向您展示了如何使用内部连接将 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
祝你好运。