用于连接表的 Mysql 子查询


Mysql SubQueries to join tables

我的问题是:

我有 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

祝你好运。