有两张桌子
用户
+--+----+
|id|name|
+--+----+
1 A
2 B
Run Code Online (Sandbox Code Playgroud)
命令
+--+--------+-------+-------+
|id|subtotal|created|user_id|
+--+--------+-------+-------+
1 10 1000001 1
2 20 1000002 1
3 10 1000003 2
4 10 1000005 1
Run Code Online (Sandbox Code Playgroud)
这个想法是让AVG,SUM并从用户的最后创建的订单.
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
Run Code Online (Sandbox Code Playgroud)
例如,SQL请求应该返回:
+--+----+---+--------+
|id|name|sum|date |
+--+----+---+--------+
1 A 40 1000005
2 B 10 1000003
Run Code Online (Sandbox Code Playgroud)
但上面的SQL无法计算总和.我错过了什么?
您的查询似乎太复杂了.这个怎么样?
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;
Run Code Online (Sandbox Code Playgroud)
在MySQL中,避免FROM子句中不必要的子查询尤为重要.这些实际上已实现,并且可能妨碍使用索引来提高性能.
| 归档时间: |
|
| 查看次数: |
60 次 |
| 最近记录: |