Mysql 组合两个select查询

Mysql 组合两个select查询,mysql,join,subquery,left-join,Mysql,Join,Subquery,Left Join,当我使用两个查询时,一个最初被调用,第二个在循环过程中通过第一个查询的结果被调用。我想合并这两个查询,但到目前为止无法合并。从中提取查询的表包括: +--------------+ +--------------+ +--------------------------+ | table_1 | | table_2 | | table_3 | +----+---------+ +----+---------+

当我使用两个查询时,一个最初被调用,第二个在循环过程中通过第一个查询的结果被调用。我想合并这两个查询,但到目前为止无法合并。从中提取查询的表包括:

+--------------+    +--------------+    +--------------------------+
|    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  |    +----+---------+    +----+----------+----------+
+----+---------+
表3
中的
表1
表2
之间存在多对多关系。到目前为止,我一直使用分离查询。一个查询返回
表1
的所有内容,第二个查询返回通过
表3
连接到
表1
表2
的值。但是,我希望取消循环,减少发送到服务器的查询量。我已尝试使用
加入

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)
这返回了我想要的结果,只是它只返回了
表3
中的值,而忽略了
表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
这产生了一个
错误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 |       |       |
+---------------+---------------+---------------+---------------+

此外,我希望能够对
表1.name
表2.name
的结果进行排序。如果有人有什么建议,请告诉我。

那么你只是想打印出所有相关的对?那么:

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

你只是想把所有相关的配对都打印出来?那么:

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

要从表_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' '' 表\u 1.id表\u 1.name表\u 2.id表\u 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''
要从表_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' '' 表\u 1.id表\u 1.name表\u 2.id表\u 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''
左连接
更改为
右连接
,以及两个连接在查询中出现的顺序解决了此问题。这是工作守则的副本

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;

左连接
更改为
右连接
,以及两个连接在查询中出现的顺序解决了此问题。这是工作守则的副本

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;

使用
内部联接的查询
返回的结果与使用
左联接的查询相同。唯一返回的结果是
表3
中包含的结果。省略表1中的一些数据。使用
内部联接的查询
返回的结果与使用
左联接的查询相同。唯一返回的结果是
表3
中包含的结果。在
FOR
子句中使用
table_1
和两个相应的
LEFT JOIN
语句时,会抛出
错误1066
。@Brook Julias:ERROR 1066表示表/别名不唯一。避免给两个表提供相同的别名,这样应该可以工作。我已经在您的表结构上测试了查询。我在回答中发布的结果是我在测试查询时得到的结果的副本/粘贴。当在
FOR
子句中使用
table_1
和两个相应的
LEFT JOIN
语句时,抛出
ERROR 1066
。@Brook Julias:ERROR 1066表示表/别名不唯一。避免给两个表提供相同的别名,这样应该可以工作。我已经在您的表结构上测试了查询。我在回答中发布的结果是我在测试查询时得到的结果的副本/粘贴。如果表_1中的行在表_3中没有相应的条目,是否希望包括这些行;如果表_2中的行在表_3中没有相应的条目,是否希望包括这些行?在这种情况下,您正在寻找一个完整的外部连接,MySql不支持。您可以通过执行外部联接(单向联合外部联接)或以另一种方式执行外部联接来实现完全外部联接。如果表_1中的行在表_3中没有相应的条目,是否希望包括这些行;如果表_2中的行在表_3中没有相应的条目,是否希望包括这些行?在这种情况下,您正在寻找一个完整的外部连接,MySql不支持。通过以一种方式进行外部联接,然后以另一种方式进行外部联接,可以实现完全外部联接。