我的问题如下:
我有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所需的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操作)。
答案 0 :(得分: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
要充分了解联接知识,请访问以下链接:
答案 1 :(得分:1)
不完全确定我了解您的需求。 @JW正确地向您展示了如何使用INNER JOIN将3个表连接在一起。
您的查询非常接近。您应该使用WHERE ID_C IN()而不是使用WHERE ID_C =。
SELECT FieldToGet
FROM table3
WHERE ID_C IN (SELECT ID_C FROM table2 WHERE ID_A =$SOME_ID_A)
我个人更喜欢在IN上使用JOIN,但是根据你的数据库结构,使用IN实际上可以更好地执行,因为使用JOIN可以返回多个结果并需要使用DISTINCT或GROUP BY。这是我读到的一篇好文章:
http://explainextended.com/2009/06/16/in-vs-join-vs-exists/
一个关于SO:
祝你好运。