mysql - 组合两个选择查询

标签 mysql join subquery left-join

当我使用两个查询时,一个最初被调用,第二个在循环访问第一个结果的过程中被调用。我想结合这两个查询,但到目前为止还不能。查询从中提取的表是:

+--------------+    +--------------+    +--------------------------+
|    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_1table_3 中的table_2 之间存在多对多关系。到目前为止,我一直在使用分隔查询。一个查询返回 table_1 的所有内容,第二个查询返回通过 table_3 连接到 table_1table_2 的值。但是,我想取消循环并减少发送到服务器的查询量。我试过使用 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)

除了它只返回 table_3 中的值而忽略了 table_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.nametable_2.name 的结果进行排序。如果有人有建议,请告诉我。

最佳答案

要从 table_1 中获取在其他表中没有匹配项的行,您应该使用 OUTER JOIN 而不是 INNER JOIN:

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'                  ''          

关于mysql - 组合两个选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3671452/

相关文章:

php - 如何多次插入结果集?

php - SQL 备份无法与 PHP 脚本一起使用

mysql - 使用父 ID 和子 ID 加入

php - 从表中选择逗号分隔的记录

swift - 如何合并两个 Firebase 快照

sql - DELIMITER//在触发器中做什么?

php - 从 mysql 数据库中选择 json 对象

mysql - 总结每周收入,包括空记录

python - 如何加入数据框?

mysql where子句子查询不识别外部查询中的表别名