我不認爲這是可能的,因爲你的獨特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一個LEFT
和RIGHT
一起加入:
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 - 可以有一個聰明的方法來分組和總和來達到你的效果。
快速問題 - 你知道數據庫表名是區分大小寫的,對吧?即如果你的表被稱爲'A',你不能用'a.x'引用它的列,你必須使用'A.x'。事實上,這可能是你的問題。 – 2012-02-28 00:29:40
其實它不是'A',正確的是'a'!我會糾正這一點,謝謝。 – samra 2012-02-28 00:55:48
嗯,如果我用'x','y','foo'和'bar'這兩列創建一個表'a'並對它們運行你的查詢,它就行得通 - 我得到一列有三列'x', 'y'和'foo_sum',以及兩個查詢的行('bar_sum'行出現在'foo_sum'列)。你遇到了什麼確切的錯誤? (「我的程序不知道foo_sum」 - 當你直接輸入mysql客戶端時查詢是否工作?如果是這樣,我們可以將問題縮小到你的程序)。 – 2012-02-28 01:11:55