SQL连接和项目总和

时间:2016-09-01 21:23:01

标签: mysql sql

有两个表

用户

+--+----+
|id|name|
+--+----+
 1   A    
 2   B

订单

+--+--------+-------+-------+
|id|subtotal|created|user_id|
+--+--------+-------+-------+
 1  10       1000001   1
 2  20       1000002   1
 3  10       1000003   2
 4  10       1000005   1

我们的想法是从用户那里获取AVGSUM和最后创建的订单。

SELECT
  users.name,
  users.phone,
  SUM(a.subtotal),
  COALESCE(a.created, NULL)
  FROM users
LEFT JOIN
  (
  SELECT
    orders.id,
    orders.subtotal,
    orders.user_id,
    orders.created
  FROM
    orders 
  JOIN(
    SELECT MAX(i.created) created, i.user_id 
      FROM orders i
      GROUP BY i.user_id
  )AS j ON(j.user_id = orders.user_id AND orders.created = j.created) GROUP BY orders.user_id
) AS a ON users.id = a.user_id
GROUP BY users.id

例如,SQL请求应该返回:

+--+----+---+--------+
|id|name|sum|date    |
+--+----+---+--------+
 1   A    40  1000005
 2   B    10  1000003

但是上面的SQL无法计算总和。我错过了什么?

1 个答案:

答案 0 :(得分:8)

你的查询似乎太复杂了。怎么样?

SELECT u.id, u.name, SUM(o.subtotal), MAX(o.created)
FROM users u LEFT JOIN
     orders o
     ON u.id = o.user_id
GROUP BY u.id, u.name;

在MySQL中,避免FROM子句中不必要的子查询尤为重要。这些实际上是物化的,可能妨碍索引的使用。