Mysql SubQueries连接表

时间:2013-01-31 02:20:48

标签: php mysql sql database join

我的问题如下:

我有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操作)。

2 个答案:

答案 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:

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

祝你好运。