2012-06-06 49 views
1

MySQL的SUM不同行,我有以下MySQL表,其中B_ID是一個外鍵指向表-B的ID列:根據外鍵無子查詢

---------- ----------- 
|Table_A | |Table_B | 
---------- ----------- 
|B_ID int| |ID int | 
---------- |VALUE int| 
       ----------- 

我想計算的價值總和Table_B中的列僅考慮在Table_A中顯示爲外鍵的ID。另外,我想在Table_B中最多添加一行。

因此,如果表被填充了以下數據:

------ ------------ 
|B_ID| |ID | VALUE| 
------ ------------ 
|1 | |1 | 50 | 
|2 | |2 | 100 | 
|2 | |3 | 200 | 
------ ------------ 

總和將是150(計算爲50 + 100)。

我現在使用的查詢是:

SELECT SUM(b.VALUE) 
FROM Table_B b 
WHERE b.id IN (SELECT DISTINCT B_ID FROM Table_A) 

不過,我想避免,如果在所有可能有一個子查詢。任何想法如何做到這一點,而無需子查詢?

注:此查詢本身就是一個大的查詢子查詢,所以也只能選擇一列。

回答

1

這並不排除子查詢,但是,如果你有a一些記錄和許多更有效的b

SELECT SUM(value) 
FROM (
     SELECT DISTINCT b_id 
     FROM a 
     ) a 
JOIN b 
ON  b.id = a.b_id 

此創建於a.b_id的索引快速地工作。

如果有b一些記錄和許多人在a,原始查詢將會更快。該指數的建議仍然適用。

+0

謝謝。這是一個很好的方法,儘管我不能將它用於真實場景,因爲查詢將嵌套在較大的查詢中,並且由於某些字段無法訪問,所以Table_A上的一些其他約束將無法工作(基本上,這裏所述的問題http://bugs.mysql.com/bug.php?id=16029) – Epicurus