[英]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
对于您怀疑的所有需求,这应该足够好了,而不会造成任何麻烦。
改写:
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.