Php 连接表的Mysql子查询

Php 连接表的Mysql子查询,php,mysql,sql,database,join,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关联 表B:具有以下结构:` | ID_B | ID_C | ID_A| | 2

我的问题如下:

我有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所需的FID,但它失败了,因为我的子查询返回多行:

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

我正在寻找一个只从columm FieldToGet当前尝试获取结果的解决方案,或者一个将联接整个basetable的解决方案,其中列FieldToGet不确定如何使用联接操作参数。

联接将如下所示

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
要全面了解加入,请访问以下链接:


连接将如下所示

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
要全面了解加入,请访问以下链接:


我不完全确定我是否理解你的需求@JW正确地向您展示了如何使用内部联接将3个表连接在一起

你的问题很接近。您不应该使用WHERE ID\u C=,而应该使用WHERE ID\u C IN

SELECT FieldToGet 
FROM table3  
WHERE ID_C IN (SELECT ID_C FROM table2 WHERE ID_A =$SOME_ID_A)
我个人更喜欢使用联接而不是INs,但是根据您的DB结构,使用IN实际上可以执行得更好,因为使用联接可能会返回多个结果,并且需要使用DISTINCT或GROUP BY。这是我读到的一篇很好的帖子:

还有一个:


祝你好运。

我不完全确定我是否理解你的需要@JW正确地向您展示了如何使用内部联接将3个表连接在一起

你的问题很接近。您不应该使用WHERE ID\u C=,而应该使用WHERE ID\u C IN

SELECT FieldToGet 
FROM table3  
WHERE ID_C IN (SELECT ID_C FROM table2 WHERE ID_A =$SOME_ID_A)
我个人更喜欢使用联接而不是INs,但是根据您的DB结构,使用IN实际上可以执行得更好,因为使用联接可能会返回多个结果,并且需要使用DISTINCT或GROUP BY。这是我读到的一篇很好的帖子:

还有一个:


祝你好运。

如果我只想筛选出一个ID,而不是获取所有结果,该怎么办?此外,是否可以扩展此调用以连接另一组与tableA链接的表,例如tableD和tableE,其方式与tableB和tableC相同,或者我是否有单独的查询?如果我只想筛选出一个ID_a,而不是获取所有结果,该怎么办只需在查询中添加WHERE子句条件,例如SELECT…FROM…其中a.ID_a=1也可以扩展此调用以连接另一组表,例如链接到tableA的tableD和tableE-是,只需对tableB和tableC执行相同的操作,并在ON子句中定义它们的链接列。如果我只想筛选出单个ID_a,而不是获取所有结果,该怎么办?此外,是否可以扩展此调用以连接另一组与tableA链接的表,例如tableD和tableE,其方式与tableB和tableC相同,或者我是否有单独的查询?如果我只想筛选出一个ID_a,而不是获取所有结果,该怎么办只需在查询中添加WHERE子句条件,例如SELECT…FROM…WHERE a.ID_a=1也可以扩展此调用以连接另一组表,例如链接到tableA的tableD和tableE-是的,只需对tableB和tableC执行相同的操作,并在ON子句中定义它们的链接列。好了。JW的答案是正确的,但现在我想知道是否可以扩展查询以将另外两个表连接到tableA,它们与tableB和tableC具有相同的tableA链接。你听懂了吗?最好的办法是发一个新问题。但是,如果我理解您的问题,假设您的另外两个表有一个可以链接到表a ID_a的字段,您可以根据需要轻松地加入任意多个表。从@JW的答案中,选择*从a.ID上的表a内部联接表b a=b.ID上的表a内部联接表c=b.ID上的表c=c.ID上的表c内部联接表a=d.ID上的表a等,明白吗?同样,这取决于你想要的结果。祝你好运,明白了。JW的答案是正确的,但现在我想知道是否可以扩展查询以将另外两个表连接到tableA,它们与tableB和tableC具有相同的tableA链接。你听懂了吗?最好的办法是发一个新问题。但是,如果我理解您的问题,假设您的另外两个表有一个可以链接到表a ID_a的字段,您可以根据需要轻松地加入任意多个表。从@JW的答案中,选择*从a.ID上的表a内部联接表b a=b.ID上的表a内部联接表c=b.ID上的表c=c.ID上的表c内部联接表a=d.ID上的表a等,明白吗?同样,这取决于你想要的结果。祝你好运