2010-07-28 75 views
2

我有兩個表,foobar多個表的SELECT查詢

+----+-----+ +----+-----+ 
| id | val | | id | val | 
+----+-----+ +----+-----+ 
| 1 | qwe | | 1 | asd | 
| 2 | rty | | 3 | fgh | 
+----+-----+ +----+-----+ 

id不是唯一在這裏。 foo中的所有ID在bar中均不相同,反之亦然。我需要計算與特定ID的所有行兩個表中,並在新表中呈現出來,如:

+----+-----------+-----------+ 
| id | count_foo | count_bar | 
+----+-----------+-----------+ 
| 1 |   1 |   1 | 
| 2 |   1 |   0 | 
| 3 |   0 |   1 | 
+----+-----------+-----------+ 

我試過UNION SELECT

SELECT id, COUNT(id) AS count_foo, 0 AS count_bar FROM foo GROUP BY id 
UNION SELECT id, 0, COUNT(id) FROM bar GROUP BY id; 

但這輸出與id=1連續兩次,像

+----+-----------+-----------+ 
| id | count_foo | count_bar | 
+----+-----------+-----------+ 
| 1 |   1 |   0 | <- not good 
| 2 |   1 |   0 | 
| 1 |   0 |   1 | <- not good 
| 3 |   0 |   1 | 
+----+-----------+-----------+ 

我也試過LEFT JOIN

SELECT id, COUNT(foo.id) AS count_foo, COUNT(bar.id) AS count_bar 
FROM foo LEFT JOIN bar USING(id) GROUP BY id; 

但這查詢忽略從表bar行用的ID表foo丟失:

+----+-----------+-----------+ 
| id | count_foo | count_bar | 
+----+-----------+-----------+ 
| 1 |   1 |   1 | 
| 2 |   1 |   0 | 
+----+-----------+-----------+ <- can I haz `id=3`? 

我缺少什麼?什麼是正確的查詢或正確的手冊閱讀?

謝謝。

+1

您是否嘗試過把你的'LEFT JOIN'聲明和'UNION '用一個有'RIGHT JOIN'的類似聲明來代替它?因爲我沒有時間去嘗試,所以我只是要求脫離頭頂。 – Stephen 2010-07-28 09:59:50

+0

@Stephen這實際上也可以,謝謝。現在我有另一個問題 - 兩個解決方案,而不是none:( – hudolejev 2010-07-28 10:36:11

回答

5

你可能想嘗試以下操作:

SELECT d.id, 
     (SELECT COUNT(*) FROM foo WHERE id = d.id) count_foo, 
     (SELECT COUNT(*) FROM bar WHERE id = d.id) count_bar 
FROM ((SELECT id FROM foo) UNION (SELECT id FROM bar)) d; 

測試用例:

CREATE TABLE foo (id int, val varchar(5)); 
CREATE TABLE bar (id int, val varchar(5)); 

INSERT INTO foo VALUES (1, 'qwe'); 
INSERT INTO foo VALUES (2, 'rty'); 
INSERT INTO bar VALUES (1, 'asf'); 
INSERT INTO bar VALUES (3, 'ghj'); 

結果:

+------+-----------+-----------+ 
| id | count_foo | count_bar | 
+------+-----------+-----------+ 
| 1 |   1 |   1 | 
| 2 |   1 |   0 | 
| 3 |   0 |   1 | 
+------+-----------+-----------+ 
3 rows in set (0.00 sec) 
+0

@hudolejev:我使用'LEFT JOINs'刪除了我的[其他示例](http://stackoverflow.com/posts/3351762/revisions),因爲如果有超過1個相同'id'的計數,另一方面,在這些情況下,使用相關子查詢的這個例子很好用。 – 2010-07-28 10:20:36

+0

非常感謝,這對我很有用。 – hudolejev 2010-07-28 10:33:45

0

您是否在尋找OUTER JOIN?

+0

是的,通過'OR'加入的東西,與'ANDNER'加入的'ANDNER'相反,但是MySQL中的AFAIR'OUTER JOIN'只用於' LEFT [OUTER] JOIN'和'RIGHT [OUTER] JOIN'由於某些兼容性原因而構造,無論如何,沒有一個適合我,結果與簡單的'LEFT JOIN'和'RIGHT JOIN'一樣。 – hudolejev 2010-07-28 10:07:11