我有一个生成正确结果的查询,它只是非常慢。我觉得必须有更好的方法(也许没有子查询)。
表、结果和查询如下。我已将数据匿名化,并且我有 8 个子查询而不是 2 个,但格式相同。
表“a”:
id userId type amount
------------------------------------
1 1 a 400
2 1 b 300
3 1 c 230
4 2 a 600
5 2 b 500
6 2 c 430
我在每一列上都有一个索引,另外还有一个包含 userId 和类型列的索引。我还可以向您保证 userId 和类型是唯一的(即用户 1 不会有两个类型“a”)。
期望的结果:
userId typeAtotal typeBtotal
--------------------------------
1 400 300
2 600 500
我的查询:
SELECT userId,
(SELECT amount
FROM a AS a2
WHERE a2.userId = a1.userId
AND a2.type = 'a') AS aAmt,
(SELECT amount
FROM a AS a3
WHERE a3.userId = a1.userId
AND a3.type = 'b') AS bAmt
FROM a AS a1
WHERE type IN ('a','b')
GROUP BY userId
最佳答案
使用:
SELECT t.userid,
MAX(CASE WHEN t.type = 'a' THEN amount ELSE NULL END) AS typeAtotal,
MAX(CASE WHEN t.type = 'b' THEN amount ELSE NULL END) AS typeBtotal
FROM YOUR_TABLE t
GROUP BY t.userid
如果任一类型可以有多个金额 - 这将返回最高金额。如果您想要添加此类情况,请使用 SUM
:
SELECT t.userid,
SUM(CASE WHEN t.type = 'a' THEN amount ELSE NULL END) AS typeAtotal,
SUM(CASE WHEN t.type = 'b' THEN amount ELSE NULL END) AS typeBtotal
FROM YOUR_TABLE t
GROUP BY t.userid
关于mysql - 运行缓慢的查询,有没有更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6100406/