请教大家一个关于订单统计 sql 的问题

2020-04-23 10:06:06 +08:00
 liubx

现在有个功能需要统计每个用户的首单。自己写的 sql 不太满意,希望大家能指点下。

这是我写的 sql

SELECT * FROM order WHERE create_time IN (
		SELECT min( create_time ) create_time FROM
			order WHERE
			order_status IN ( 'PRE_DELIVER', 'PRE_ACCEPT', 'AFTER_DELIVER' ) 
			AND user_id in (1,2,3,4) AND deleted = 0 GROUP BY user_id 
	) 
GROUP BY user_id

我是先查询出每个用户第一单的时间,在通过时间去查询对应的订单。

但想不出怎么去优化,只能请教下大家,希望能给一些思路

4148 次点击
所在节点    MySQL
39 条回复
linauror
2020-04-23 10:18:39 +08:00
`
SELECT *,MIN(create_time) FROM order WHERE order_status IN ( 'PRE_DELIVER', 'PRE_ACCEPT', 'AFTER_DELIVER' ) AND user_id in (1,2,3,4) AND deleted = 0 GROUP BY user_id
`
试试这个呢
kamisama
2020-04-23 10:21:17 +08:00
这种最好把表索引也发出来
dongisking
2020-04-23 10:27:17 +08:00
敢用子查询的都是菜鸡吧
liubx
2020-04-23 10:35:40 +08:00
@linauror 不行,这只能让 create_time 是第一单的时间,其他的列还是默认查询的列
zhuzhibin
2020-04-23 10:36:30 +08:00
@dongisking 有必要吗?人家是请教问题 ?你在干嘛?
zhuzhibin
2020-04-23 10:36:30 +08:00
@dongisking 有必要吗?人家是请教问题 ?你在干嘛?
liubx
2020-04-23 10:37:45 +08:00
@kamisama 索引是`user_id`,`create_time``sale_order_no``deleted`这四个字段
liubx
2020-04-23 10:38:17 +08:00
@dongisking 嗯,数据库确实不熟,大佬指点下啊
newtype0092
2020-04-23 10:42:22 +08:00
@dongisking 多干两年接触点复杂业务再来说话。
CrazyMoon
2020-04-23 10:45:50 +08:00
不太懂怎么优化,不过感觉这个 sql 的正确性可能有问题。。如果有多订单同时创建的话,按照 create time 取会取出多余的订单
moonsola
2020-04-23 11:06:20 +08:00
要我就选择在用户表里加个字段:first_order_id
lifespy
2020-04-23 11:09:27 +08:00
liubx
2020-04-23 11:10:57 +08:00
@CrazyMoon 嗯,用户多了确实有这个问题。但是没有想到其他的 sql
lifespy
2020-04-23 11:11:48 +08:00
如果数据量特别大的话,建议专门独立一个表出去存储
mwiker
2020-04-23 11:15:38 +08:00
SELECT t.*
FROM order t
INNER JOIN (
SELECT user_id, min(create_time) create_time
FROM order
WHERE order_status IN ( 'PRE_DELIVER', 'PRE_ACCEPT', 'AFTER_DELIVER' )
AND user_id in (1,2,3,4)
AND deleted = 0
GROUP BY user_id ) t2
ON t.user_id = t2.user_id
AND t.create_time = t2.create_time
int11
2020-04-23 11:15:51 +08:00
订单 id 是自增的话,通过 id 大小去判断要好一些
mwiker
2020-04-23 11:17:59 +08:00
搞个 mysql8.0,有开窗函数做这些就很简单了
Tomorrowxxy
2020-04-23 11:18:55 +08:00
如果是 mysql5.7 版本以下的
tinybaby365
2020-04-23 11:19:05 +08:00
order 表有多大,每个用户平均有几单?如果你是在线上 db 操作,我有点担心你这一次性把所有用户首单查出来的操作把会把你的 db 搞挂。如果是操作 OLAP 的 DB,那无所谓啦。
Tomorrowxxy
2020-04-23 11:21:03 +08:00
SELECT * FROM
order WHERE
order_status IN ( 'PRE_DELIVER', 'PRE_ACCEPT', 'AFTER_DELIVER' )
AND user_id in (1,2,3,4) AND deleted = 0 GROUP BY user_id ORDER BY order_id
)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/665228

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX