繁体   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