簡體   English   中英

適用於多個SUM的MySQL子查詢

[英]MySQL SubQueries for multiple SUMs

如果我需要在相似的WHERE條件下獲得5個以上的不同SUM值,那么通過一個包含五個子查詢的查詢的最佳方法(也許是唯一的方法)嗎? 例如,我的查詢是:

SELECT user, 
(SELECT SUM(amount) FROM table t, table2 t2 WHERE t.table2_id = t2.id AND table2.type = 1 AND user = 1 AND date = x) AS one,
(SELECT SUM(amount) FROM table t, table2 t2 WHERE t.table2_id = t2.id AND table2.type = 2 AND user = 1 AND date = x) AS two, 
(SELECT SUM(amount) FROM table t, table2 t2 WHERE t.table2_id = t2.id AND table2.type = 3 AND user = 1 AND date = x) AS three, 
(SELECT SUM(amount) FROM table t, table2 t2 WHERE t.table2_id = t2.id AND table2.type = 4 AND user = 1 AND date = x) AS four, 
(SELECT SUM(amount) FROM table t, table2 t2 WHERE t.table2_id = t2.id AND table2.type = 5 AND user = 1 AND date = x) AS five 
FROM table 
WHERE user = 1

到目前為止,我的查詢速度非常快,但是當有更多記錄時,我擔心五個以上子查詢的含義。

出於好奇,與五個子查詢相比,具有五個子查詢的這樣一個查詢在性能上是否具有優勢/劣勢? 我以為它會更快,因為它只是一次數據庫之旅,而不是5次?

編輯:有大約60條記錄的表2,用於對表1中的數千條記錄進行分類。表2中的每條記錄按類型值1-5進行分類(這是我用來對項目進行分組的值)我想要的總和。

您只需要一個查詢即可獲得每種類型的總和:

SELECT 
  t2.type, 
  SUM(t.amount) 
FROM 
  table t 
INNER JOIN 
  table2 t2 
ON 
  t.table2_id = t2.id 
AND 
  t.user = 1
AND 
  t.date = x 
GROUP BY 
  t2.type

好。 如果這僅適用於一個用戶,而您並不需要絕對按此順序...。您可以這樣做。

select user, type, sum(amount)
where user = 1
and date = x
and type between (1,5)
group by user, type

這會給你

1,1,sum
1,2,sum
1,3,sum
1,4,sum
1,5,sum

代替

1,sum1,sum2,sum3,sum4,sum5

對於您懷疑的所有需求,這應該足夠好了,而不會造成任何麻煩。

  1. 使用ANSI JOINS
  2. 您最好像下面的查詢一樣以PIVOT形式編寫查詢

改寫:

SELECT t.user, 
SUM(CASE table2.type WHEN 1 then amount else 0 end) As one,
SUM(CASE table2.type WHEN 2 then amount else 0 end) As two,
SUM(CASE table2.type WHEN 3 then amount else 0 end) As three,
SUM(CASE table2.type WHEN 4 then amount else 0 end) As four,
SUM(CASE table2.type WHEN 5 then amount else 0 end) As five
FROM table t
INNER JOIN table2 t2 ON t.table2_id = t2.id 
WHERE t.user = 1
  AND table2.type in (1,2,3,4,5)

我了解您的查詢是偽查詢,但是它有一個懸掛的WHERE user沒有FROM子句。 至於性能,上面的內容一口氣通過了表格。 5x子查詢形式將進行5次傳遞,但如果有適當的索引可用,則不應慢很多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM