mysql - 通过 MySQL 查询优化组

标签 mysql sql-optimization

我有一个 orders 表,其中连续保存一个用户订单的一个项目。因此每个用户可以出现在许多行中。每个订单行都有一个状态 - PENDINGAPPROVED 等。我想计算每个用户每个状态的订单数量,即有多少订单已批准,有多少订单仍在等待处理等等。我提出了以下查询:

SELECT 
    u.email, u.id,
    (SELECT count(status) FROM orders WHERE user_id = o.user_id AND status = 'PENDING') pending,
    (SELECT count(status) FROM orders WHERE user_id = o.user_id AND status = 'APPROVED') approved,
    (SELECT count(status) FROM orders WHERE user_id = o.user_id AND status = 'REJECTED') rejected,
    (SELECT count(status) FROM orders WHERE user_id = o.user_id AND status = 'ERROR') error
FROM orders o INNER JOIN users u ON o.user_id = u.id
GROUP BY o.user_id, u.email

问题是它太慢了!我的 orders 表中有大约 5000 条记录,执行需要几分钟。请指教如何优化。

最佳答案

您可以使用条件聚合来消除子查询:

SELECT 
    u.email, u.id,
    COUNT(CASE WHEN status = 'PENDING' THEN 1 END) pending,
    COUNT(CASE WHEN status = 'APPROVED' THEN 1 END) approved,
    COUNT(CASE WHEN status = 'REJECTED' THEN 1 END) rejected,
    COUNT(CASE WHEN status = 'ERROR' THEN 1 END) error
FROM orders o INNER JOIN users u ON o.user_id = u.id
GROUP BY o.user_id, u.email

关于mysql - 通过 MySQL 查询优化组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32748252/

相关文章:

mysql - SQL联合查询需要添加到

c# - 如何在继续之前等待 StartCoroutine() 完成

sql-server - 为什么 SQL Server 执行计划取决于比较顺序

mysql - 使用内部联接来联接时间戳略有不同的 mySQL 列

mysql - 优化SQL : How to rewrite this query to boost performance?(使用子查询,摆脱GROUP BY?)

mysql - 使用MYSQL计算同一列中多个日期之间的时间

mysql - 为什么 MySQL 不使用我的 FULLTEXT 索引?

具有基于其他操作结果的操作的 MySQL 查询

mysql - 我可以使用 EXISTS 而不是 JOIN 来加速这个查询吗?

mysql - 如何在 MySql 中获取 2.5m 行的最后一条记录