【问题标题】:Combining 2 SUMS in MySQL and optimising query在 MySQL 中结合 2 个 SUMS 并优化查询
【发布时间】:2015-01-10 04:16:32
【问题描述】:

我有以下有效的代码:

SELECT admin_teams.name,
SUM(temp_orders.amount_paid) as amount,
SUM(instalments.amount) as amount2
FROM temp_orders
LEFT JOIN admin_teams
ON admin_teams.id = temp_orders.team
LEFT JOIN instalments
ON instalments.order_id = temp_orders.order_id
WHERE 
(DATE(temp_orders.date_paid) = CURDATE()
OR DATE(instalments.date_paid) = CURDATE())
AND (temp_orders.pay_status = 4
OR instalments.pay_status = 4)
GROUP BY temp_orders.team
ORDER BY temp_orders.team ASC
LIMIT 5

它会生成一个如下所示的表格:

+-------------+--------+---------+
|    name     | amount | amount2 |
+-------------+--------+---------+
| team name 1 |    100 |     150 |
| team name 2 |    200 |     250 |
| team name 3 |   300  |     175 |
+-------------+--------+---------+

我有两个问题;

  1. 我实际上只想要一列,它是数量和数量2 的总和。
  2. 查询非常慢 - 这需要 190 秒才能运行。

我确实让它几乎与几乎即时的 Union 一起工作 - 但是我无法让它完全工作,因为我的第一个 select 语句中的列数与第二个中的列数不匹配 - 表“分期付款”确实没有团队列,但表 temp_orders 有。

任何人都可以帮助解决这两个问题吗?

谢谢。

【问题讨论】:

  • 在查询前添加EXPLAIN 并运行它。使用结果编辑您的问题
  • 一位朋友建议这样做,但显然服务器没有为 EXPLAIN 设置(我不明白为什么,显然某些东西没有安装或没有更新)而且我没有访问权限,或更新它的知识。
  • 没听说过这种事,EXPLAIN自带mysql,不用更新什么的
  • 好吧,星期一用一些示例数据编辑你的问题,也许是个小提琴并发表评论。

标签: mysql


【解决方案1】:
SELECT admin_teams.name,
(SUM(temp_orders.amount_paid) + SUM(instalments.amount))  as amount,
FROM temp_orders
LEFT JOIN admin_teams
ON admin_teams.id = temp_orders.team
LEFT JOIN instalments
ON instalments.order_id = temp_orders.order_id
WHERE 
temp_orders.date_paid >= CURDATE()
OR instalments.date_paid >= CURDATE())
AND (temp_orders.pay_status = 4
OR instalments.pay_status = 4)
GROUP BY temp_orders.team
ORDER BY temp_orders.team ASC
LIMIT 5

并添加这些索引

ALTER TABLE temp_orders ADD KEY (date_paid ,pay_status,team);
ALTER TABLE instalments ADD KEY (date_paid ,pay_status);

【讨论】:

  • 感谢您的建议,我自己实际上无法进行更改,因此必须等到星期一才能进行测试。我已经尝试按照您的建议组合列,这在它返回单个列的意义上是有效的,但是它没有给出正确的值。因为我实际上不知道它是如何检索它所显示的值,所以我无法提供更多帮助。
猜你喜欢
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多