代码之家  ›  专栏  ›  技术社区  ›  Brook Julias

组合两个select查询

  •  1
  • Brook Julias  · 技术社区  · 15 年前

    +--------------+    +--------------+    +--------------------------+
    |    table_1   |    |    table_2   |    |          table_3         |
    +----+---------+    +----+---------+    +----+----------+----------+
    | id |   name  |    | id |   name  |    | id |  tbl1_id |  tbl2_id | 
    +----+---------+    +----+---------+    +----+----------+----------+
    | 1  | tbl1_1  |    | 1  | tbl2_1  |    | id |     1    |     1    |
    | 2  | tbl1_2  |    | 2  | tbl2_2  |    | id |     3    |     2    |
    | 3  | tbl1_3  |    | 3  | tbl2_3  |    | id |     3    |     3    |
    | 4  | tbl1_4  |    +----+---------+    +----+----------+----------+
    +----+---------+
    

    两者之间存在着多对多的关系 table_1 table_2 table_3 . 到目前为止,我一直使用分隔查询。一个查询返回 表1 连接到 表1 通过 表3 JOIN :

    SELECT table_1.id, table_1.name, table_2.id, table_2.name
    FROM table_3
    LEFT JOIN table_1 ON (table_3.tbl1_id = table_1.id)
    LEFT JOIN table_1 ON (table_2.tbl2_id = table_2.id)
    

    它返回了我想要的结果,只返回了 忽略了 表1 . 我尝试过使用子查询:

    SELECT  table_1.id,
        table_1.name,
        (SELECT table_2.id FROM table_2, table_3 WHERE table_2.id = table_3.tbl2_id AND table_1.id = table_3.tbl1_id) AS tbl_2_id,
        (SELECT table_2.name FROM table_2, table_3 WHERE table_2.id = table_3.tbl2_id AND table_1.id = table_3.tbl1_id) AS tbl_2_name
    FROM table_1
    

    ERROR 1242 . 到目前为止,我还没有得到任何工作。我想要的结果与此类似。

    +---------------+---------------+---------------+---------------+
    |table_1.id |table_1.name   |table_2.id |table_2.name   |
    +---------------+---------------+---------------+---------------+
    |      1    |    tbl1_1 |      1    |    tbl2_1 |
    |      2    |    tbl1_2 |       |       |
    |      3    |    tbl1_3 |      2    |    tbl2_2 |
    |      3    |    tbl1_3 |      3    |    tbl2_3 |
    |      4    |    tbl1_4 |       |       |
    +---------------+---------------+---------------+---------------+
    

    table_1.name table_2.name . 如果有人有什么建议,请告诉我。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Mark Byers    15 年前

    要从表\u 1中获取在其他表中不匹配的行,应使用外部联接而不是内部联接:

    SELECT
        table_1.id,
        table_1.name,
        table_2.id,
        table_2.name
    FROM table_1
    LEFT JOIN table_3 ON table_3.tbl1_id = table_1.id
    LEFT JOIN table_2 ON table_3.tbl2_id = table_2.id
    

    结果:

    table_1.id  table_1.name  table_2.id  table_2.name
    1           'tbl1_1'      1           'tbl2_1'    
    2           'tbl1_2'                  ''          
    3           'tbl1_3'      2           'tbl2_2'    
    3           'tbl1_3'      3           'tbl2_3'    
    4           'tbl1_4'                  ''          
    
        2
  •  0
  •   ngroot    15 年前

    SELECT table_1.id, table_1.name, table_2.id, table_2.name
    FROM table_3
    INNER JOIN table_1 ON table_1.id = table_3.tbl1_id
    INNER JOIN table_2 ON table_2.id = table_3.tbl2_id
    ORDER BY table_1.id, table_2.id
    
        3
  •  0
  •   Brook Julias    14 年前

    LEFT JOIN RIGHT JOIN 两个连接在查询中出现的顺序解决了这个问题。这是工作守则的副本;

    SELECT  table_1.id,
        table_1.name,
        table_2.id,
        table_2.name
    FROM    table_3
    RIGHT JOIN  table_2 ON (table_3.tbl2_id = table_2.id)
    RIGHT JOIN  table_1 ON (table_3.tbl1_id = table_1.id)
    ORDER BY table_1.name ASC, table_2.name ASC;
    
    推荐文章