mysql - 运行缓慢的查询,有没有更好的方法?

标签 mysql sql

我有一个生成正确结果的查询,它只是非常慢。我觉得必须有更好的方法(也许没有子查询)。

表、结果和查询如下。我已将数据匿名化,并且我有 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/

相关文章:

Mysql游标在存储过程中不返回任何内容

mysql查询反向打印

mysql - 数据库中的浮点值转换

mysql - 从数据库中获取表名

mysql - 按日期排序进行分组

sql - 需要一些有关 Sql Server 和简单触发器的帮助

mysql - SQL 比较两个具有不同数据格式的表中的字符串

mysql - 在 MySQL 中使用 IF 语句并使用语句的结果进一步计算

php - 从存储中获取最后一条记录 MYSQL 性能

sql - AWS Redshift : columns into rows (wide to long)