【问题标题】:Mysql SubQueries to join tables连接表的 Mysql 子查询
【发布时间】:2013-01-31 02:20:48
【问题描述】:

我的问题如下:

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

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

我正在寻找仅从列 FieldToGet 获取结果的解决方案(我当前的尝试)或将加入整个基表的解决方案,列 FieldToGet(不确定如何使用 JOIN 操作)。

【问题讨论】:

    标签: php mysql sql database join


    【解决方案1】:

    连接将如下所示,

    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
    

    要全面了解联接,请访问以下链接:

    【讨论】:

    • 如果我只想过滤出单个 ID_A 而不是获取所有结果怎么办?还可以扩展此调用以加入另一组表,例如 tableD 和 tableE,它们链接到 tableA 的方式与 tableB 和 tableC 相同,还是我有单独的查询?
    • "如果我只想过滤掉单个 ID_A,而不是获取所有结果怎么办?" -- 只需在查询中添加 WHERE 子句条件,示例SELECT...FROM...WHERE a.ID_A = 1 "也可以扩展此调用以加入另一组表,例如链接到 tableA 的 tableD 和 tableE" - 是的,只需对 tableB 和 tableC 执行相同操作,并且在ON 子句中定义它们的链接列。
    【解决方案2】:

    不完全确定我了解您的需求。 @JW 正确地向您展示了如何使用 INNER JOIN 将您的 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

    祝你好运。

    【讨论】:

    • 好的,知道了。 JW 的回答是正确的,但现在我想知道是否可以扩展查询以将其他 2 个表连接到 tableA,这些表与 tableB 和 tableC 具有相同的链接到 tableA。你跟着我吗?
    • 最好的办法是发布一个新问题。但是,如果我理解您的问题,假设您的其他 2 个表有一个可以链接到表 A (ID_A) 的字段,您可以轻松地加入尽可能多的数据。从@JW的回答中, SELECT * 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 INNER JOIN tableD d ON a.ID_A = d.ID_A 等等。明白了?同样,取决于您想要的结果。祝你好运。
    猜你喜欢
    • 2015-09-26
    • 2011-11-25
    • 2010-11-06
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多