2010-09-08 190 views
1

当我使用两个查询时,一个被初始调用,第二个在第一个结果循环中被调用。我想结合这两个查询,但迄今为止还没有办法。查询从拉的表是:结合两个select查询

+--------------+ +--------------+ +--------------------------+ 
| 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_3table_2之间一对多的关系。到目前为止,我一直在使用分隔查询。一个查询返回table_1的所有内容,第二个查询返回连接到table_1table_3的值table_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_3table_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结果。如果有人有一个建议,请让我知道。

+0

如果table_1中没有相应的条目,并且table_2中没有相应条目的table_2中的行,是否希望包含table_1中的行?在这种情况下,您正在寻找MySql不支持的FULL OUTER JOIN。通过以一种方式进行外部联接,您可以实现完全外部联接。 – 2010-09-08 20:43:01

回答

0

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; 
0

所以你只是试图打印出所有的相关配对?如何:

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 
+0

使用'INNER JOIN'的查询返回与使用'LEFT JOIN'查询相同的查询。返回的唯一结果是包含在'table_3'中的结果。在'table_1'中留下一些数据。 – 2010-09-08 20:16:29

1

要想从TABLE_1有没有匹配的其它表,你应该使用一个外行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'     ''   
+0

当在FOR子句中使用'table_1'和两个对应的'LEFT JOIN'语句引发'ERROR 1066'时。 – 2010-09-08 20:32:43

+0

@Brook Julias:错误1066意味着*不是唯一的表/别名*。避免给两个表相同的别名,它应该工作。我已经在你的表结构上测试了这个查询。我在我的答案中发布的结果是测试查询时得到的结果的复制/粘贴。 – 2010-09-08 20:53:04