2010-09-08 272 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