2012-02-28 97 views
1

我有這樣的SQL查詢:如何在MySQL中使用同一個表,不同組聯合查詢通過?

select a.x, a.y, sum(a.foo) as foo_sum 
from a 
group by a.x 

並運行此查詢後,我可以訪問foo_sum。

我想要做這樣的事情:

select a.x, a.y, sum(a.foo) as foo_sum 
from a 
group by a.x 
union 
select a.x, a.y, sum(a.bar) as bar_sum 
from a 
group by a.y 

,但在運行此之後,我的程序dosent知道foo_sum,任何人都知道這是爲什麼?

謝謝。

編輯:我想要4列x,y,foo_sum和bar_sum,這可能嗎?

+0

快速問題 - 你知道數據庫表名是區分大小寫的,對吧?即如果你的表被稱爲'A',你不能用'a.x'引用它的列,你必須使用'A.x'。事實上,這可能是你的問題。 – 2012-02-28 00:29:40

+0

其實它不是'A',正確的是'a'!我會糾正這一點,謝謝。 – samra 2012-02-28 00:55:48

+0

嗯,如果我用'x','y','foo'和'bar'這兩列創建一個表'a'並對它們運行你的查詢,它就行得通 - 我得到一列有三列'x', 'y'和'foo_sum',以及兩個查詢的行('bar_sum'行出現在'foo_sum'列)。你遇到了什麼確切的錯誤? (「我的程序不知道foo_sum」 - 當你直接輸入mysql客戶端時查詢是否工作?如果是這樣,我們可以將問題縮小到你的程序)。 – 2012-02-28 01:11:55

回答

1

我不認爲這是可能的,因爲你的獨特x值的數量可能不一樣的獨特y值的數量。

例如,假設a是這樣的:

+------+------+------+------+ 
| x | y | foo | bar | 
+------+------+------+------+ 
| 1 | 1 | 3 | 4 | 
| 1 | 2 | 3 | 6 | 
| 1 | 1 | 3 | 6 | 
| 1 | 2 | 8 | 3 | 
| 2 | 1 | 7 | 32 | 
| 2 | 2 | 7 | 34 | 
| 2 | 3 | 8 | 3 | 
+------+------+------+------+ 

第一個查詢(foo_sum GROUP BY x)將得到:

+------+------+---------+ 
| x | y | foo_sum | 
+------+------+---------+ 
| 1 | 1 |  17 | 
| 2 | 1 |  22 | 
+------+------+---------+ 

第二(bar_sum GROUP BY y)給出:

+------+------+---------+ 
| x | y | bar_sum | 
+------+------+---------+ 
| 1 | 1 |  42 | 
| 1 | 2 |  43 | 
| 2 | 3 |  3 | 
+------+------+---------+ 

你怎麼可以搗毀bar_sum專欄o n foo_sum表的結尾?有沒有相應爲(X,Y)=(2,3)foo_sum值,但有相應bar_sum

你可以實現將是這樣的最好的:

+------+------+---------+-------+ 
| x | y | bar_sum |foo_sum| 
+------+------+---------+-------+ 
| 1 | 1 |  42 | 17 | 
| 1 | 2 |  43 | NULL | 
| 2 | 3 |  3 | NULL | 
| 2 | 1 | NULL | 22 | 
+------+------+---------+-------+ 

要做到這一點,我能想到使用FULL OUTER JOIN的唯一途徑。請注意,做SELECT x, y, SUM(foo), SUM(bar) FROM a GROUP BY x,y不會給出相同的結果,因爲它的分組方式不同。

SELECT t1.x,t1.y,foo_sum,bar_sum 
FROM 
(SELECT x, y, SUM(foo) as foo_sum 
FROM A 
GROUP BY x) t1 
FULL OUTER JOIN 
(SELECT x, y, SUM(bar) as bar_sum 
FROM A 
GROUP BY y) t2 
ON t1.x=t2.x AND t1.y=t2.y 

這可以確保所有從每個表中的x,y組合被插入,即使是在其它表中沒有對應的x,y

然而 MySQL有沒有FULL OUTER JOIN,你必須模擬A FULL OUTER JOIN B通過UNION ING一個LEFTRIGHT一起加入:

SELECT ... 
FROM A LEFT JOIN B ON ... 
UNION 
SELECT ... 
FROM A RIGHT JOIN B ON ... 

你的情況,這將轉換爲非常難看:

SELECT t1.x,t1.y,foo_sum,bar_sum 
FROM 
(SELECT x, y, SUM(foo) as foo_sum 
FROM A 
GROUP BY x) t1 
LEFT JOIN      -- need FULL OUTER JOIN 
(SELECT x, y, SUM(bar) as bar_sum 
FROM A 
GROUP BY y) t2 
ON t1.x=t2.x AND t1.y=t2.y 

UNION 

SELECT t2.x,t2.y,foo_sum,bar_sum 
FROM 
(SELECT x, y, SUM(foo) as foo_sum 
FROM A 
GROUP BY x) t1 
RIGHT JOIN      -- need FULL OUTER JOIN 
(SELECT x, y, SUM(bar) as bar_sum 
FROM A 
GROUP BY y) t2 
ON t1.x=t2.x AND t1.y=t2.y 

這是非常低效!我建議你不要在SQL方面進行PHP方面的分組(或者你在MySQL中使用的任何其他語言)。

誰知道,可能有更高效的方法來做到這一點,因爲所有你想要的是SUM s - 可以有一個聰明的方法來分組和總和來達到你的效果。

+0

非常感謝你,我認爲你是對的,在這種情況下,PHP方面比sql方面更有效率! – samra 2012-03-01 14:04:39

0

這是一樣的:

select a.x, a.y, sum(a.foo) as foo_sum, sum(a.bar) as bar_sum 
from a 
group by a.x ,a.y 
+0

不,它不是,因爲它現在查看x和y的唯一*鍵。 – 2012-02-28 03:20:24

相關問題