首页 > 试题广场 >

查询单日多次下订单的用户信息?

[编程题]查询单日多次下订单的用户信息?
  • 热度指数:11234 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
现有某公司部分订单数据及用户会员等级数据,如下所示:
订单信息表:order_tb(订单id-order_id,用户id-user_id,订单金额-order_price,订单创建时间-order_time)
order_id user_id order_price order_time
101 11 380 2022-09-01 09:00:00
102 12 200 2022-09-01 10:00:00
103 13 260 2022-09-01 12:00:00
104 11 100 2022-09-02 11:00:00
105 12 150 2022-09-02 12:00:00
106 12 1200 2022-09-02 13:00:00
107 11 60 2022-09-03 09:00:00
108 13 380 2022-09-03 09:30:00
会员等级信息表:uservip_tb用户id-user_id,会员等级-vip,积分-point
user_id vip point
10 银卡会员 530
11 银卡会员 1555
12 钻石会员 12000
13 金卡会员 6115
14 普通会员 230
15 银卡会员 810
16 普通会员 330
请查询单日下单多次的用户信息?
要求输出:订单日期,user_id,下单次数,会员等级
注:单日多次下订单指该日同一用户下单次数大于1次,结果按照下单次数降序排序
示例数据结果如下:
order_date user_id order_nums vip
2022-09-02 12 2 钻石会员

结果解释:
user_id为12的用户在9月2日分别下了order_id为105、106的订单,故结果如上。
示例1

输入

drop table if exists  `order_tb` ; 
CREATE TABLE `order_tb` (
`order_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`order_price` int(11) NOT NULL,
`order_time` datetime NOT NULL,
PRIMARY KEY (`order_id`));
INSERT INTO order_tb VALUES(101,11,380,'2022-09-01 09:00:00'); 
INSERT INTO order_tb VALUES(102,12,200,'2022-09-01 10:00:00'); 
INSERT INTO order_tb VALUES(103,13,260,'2022-09-01 12:00:00'); 
INSERT INTO order_tb VALUES(104,11,100,'2022-09-02 11:00:00'); 
INSERT INTO order_tb VALUES(105,12,150,'2022-09-02 12:00:00'); 
INSERT INTO order_tb VALUES(106,12,1200,'2022-09-02 13:00:00'); 
INSERT INTO order_tb VALUES(107,11,60,'2022-09-03 09:00:00'); 
INSERT INTO order_tb VALUES(108,13,380,'2022-09-03 09:30:00'); 

drop table if exists  `uservip_tb` ; 
CREATE TABLE `uservip_tb` (
`user_id` int(11) NOT NULL,
`vip` varchar(16) NOT NULL,
`point` int(11) NOT NULL,
PRIMARY KEY (`user_id`));
INSERT INTO uservip_tb VALUES(10,'银卡会员',530); 
INSERT INTO uservip_tb VALUES(11,'银卡会员',1555); 
INSERT INTO uservip_tb VALUES(12,'钻石会员',12000); 
INSERT INTO uservip_tb VALUES(13,'金卡会员',6115); 
INSERT INTO uservip_tb VALUES(14,'普通会员',230); 
INSERT INTO uservip_tb VALUES(15,'银卡会员',810); 
INSERT INTO uservip_tb VALUES(16,'普通会员',330);

输出

order_date|user_id|order_nums|vip
2022-09-02|12|2|钻石会员
select
    date(o.order_time) as order_date,
    o.user_id,
    count(o.user_id) as order_nums,
    u.vip
from order_tb o 
left join uservip_tb u 
on o.user_id = u.user_id
group by o.user_id, date(o.order_time)
having count(o.user_id) > 1
发表于 2023-07-14 10:35:23 回复(1)
select 
date(order_time) order_date,
o.user_id,
count(order_id) order_nums,
vip
from order_tb o join uservip_tb u
on o.user_id = u.user_id 
group by o.user_id,vip,order_date
having order_nums > 1
order by order_nums desc

发表于 2025-03-24 23:53:38 回复(1)
select 
date(o.order_time) order_date
,o.user_id
,count(o.user_id) order_nums
,u.vip
from order_tb o
join uservip_tb u on o.user_id = u.user_id
group by o.user_id,date(o.order_time)
having count(o.user_id) > 1
发表于 2025-03-20 16:00:44 回复(0)
select date_format(order_time,"%Y-%m-%d") order_date,a.user_id,count(order_id) order_nums, vip
from order_tb a join uservip_tb b on a.user_id = b.user_id
group by order_date,user_id
having count(order_date)>1
关键在于要知道group by 多个字段的方式是用逗号隔开,第二点就是查询时间是用date_format(日期,需要格式),一般来说四位的年份需要%Y(大写Y),二位年份就是%y(小写Y)

发表于 2023-07-26 10:29:05 回复(1)
select date_format(order_time,'%Y-%m-%d') as order_date,
ut.user_id,count(*) as order_nums,vip 
from order_tb ot 
left join uservip_tb ut on ut.user_id=ot.user_id
group by order_date,ut.user_id
having order_nums>1
order by order_nums desc

发表于 2025-07-14 16:06:30 回复(0)
SELECT
    DATE(order_time) AS order_date,
    o.user_id,
    COUNT(*) AS order_nums,
    vip
FROM order_tb o
JOIN uservip_tb u USING (user_id)
GROUP BY o.user_id,DATE(order_time)
HAVING COUNT(*) > 1
ORDER BY order_nums desc
发表于 2025-07-11 10:43:09 回复(0)
with t1 as (
    select date(order_time) as order_date, user_id, count(day(order_time)) as   order_nums
    from order_tb
    group by user_id, date(order_time)
    having count(day(order_time)) > 1
)
select t1.order_date, t1.user_id, t1.order_nums, u.vip
from t1
join uservip_tb u on t1.user_id = u.user_id

发表于 2025-07-10 20:12:28 回复(0)
select
t.order_date,
t.user_id,
t.order_nums,
u.vip
from
(
select
date(order_time) as order_date,
user_id,
count(order_id) as order_nums
from
order_tb
group by
date(order_time),
user_id
having
count(order_id) > 1
) t
inner join uservip_tb as u on t.user_id = u.user_id
order by
order_nums desc

发表于 2025-06-27 19:53:19 回复(0)
select substring_index(order_time," ",1) as order_date,
       t1.user_id,
       count(*) as order_nums,
       vip
from order_tb t1 left outer join uservip_tb t2 on t1.user_id=t2.user_id
group by order_date,t1.user_id
having count(*)>1;

select a1.da order_date,a1.user_id,a1.cn order_nums,a1.vip
from
    (select distinct t1.user_id,
       substring_index(order_time," ",1) as da,
       vip,
       count(*) over(partition by substring_index(order_time," ",1),t1.user_id) as cn
    from order_tb t1
    left outer join uservip_tb t2
    on t1.user_id=t2.user_id) a1
    where a1.cn>1;

substring_index可以替换成其他提取日期的函数,包括date()、date_format()等
发表于 2025-06-25 14:16:01 回复(0)
select date(order_time) as order_date,o.user_id,count(o.user_id)as order_nums,vip
from order_tb o
left join uservip_tb u
on u.user_id=o.user_id
group by user_id,order_date
having order_nums>1
order by order_nums desc;
发表于 2025-06-25 01:22:04 回复(0)
select date(order_time) order_date,u.user_id user_id,count(u.user_id) order_nums,vip
from uservip_tb u join order_tb o on u.user_id=o.user_id
group by u.user_id,date(order_time),vip having count(u.user_id)>1#不要用where,聚合函数不能在where子句里
发表于 2025-06-24 09:36:34 回复(0)
select
    date(ot.order_time) as order_date,
    ot.user_id,
    count(ot.order_id) as order_nums,
    ut.vip
from
    order_tb ot
    join uservip_tb ut on ot.user_id = ut.user_id
    group by order_date,ot.user_id
    having count(ot.order_id) > 1
    order by order_nums desc
执行顺序先执行having后再执行select,别名as在select语句中,所以having不能用别名order_nums,要用原始的count(ot.order_id)
发表于 2025-06-10 20:54:25 回复(0)
select 
    date(order_time) as order_date,
    o.user_id,
    count(o.user_id) as order_nums,
    vip 
from order_tb o 
left join uservip_tb u
on o.user_id = u.user_id 
group by o.user_id,vip,date(order_time)
having count(o.user_id) >1
order by order_nums desc

发表于 2025-06-10 15:37:35 回复(0)
with
    k as (
        select
            a.user_id,
            count(a.user_id) order_nums,
            date (order_time) order_date,
            vip
        from
            order_tb a
            left join uservip_tb b on a.user_id = b.user_id
        group by
            user_id,
            date (order_time),
            vip
    )
select
    order_date,
    user_id,
    order_nums,
    vip
from
    k
where
    order_nums > 1
order by
    order_nums desc

发表于 2025-06-10 09:15:32 回复(0)
select
date(order_time) order_date
,ot.user_id
,count(1) order_nums
,vip
from order_tb ot
join uservip_tb ut
on ot.user_id = ut.user_id
group by 1,2
having count(1) > 1
order by 3 desc
发表于 2025-05-30 10:00:33 回复(0)
select date(order_time) order_date,o.user_id, count(distinct order_id) order_nums,vip
from order_tb o join uservip_tb u
on o.user_id = u.user_id
group by date(order_time),o.user_id
having order_nums >1
发表于 2025-05-24 11:07:24 回复(0)
select 
date(order_time) order_date,
o.user_id,
count(order_id) order_nums,
vip
from order_tb o
left join uservip_tb u
on o.user_id = u.user_id 
group by o.user_id,vip,order_date
having order_nums > 1
order by order_nums desc
请查询单日下单多次的用户信息?
要求输出:订单日期,user_id,下单次数,会员等级
1.首先分析问题:单日下单,发现2022-09-01 09:00:00日期有时间所以使用date函数(DATE() 函数用于提取日期时间值中的日期部分)肯定要按照这个使用完函数后的结果分组,分组后再进行筛选使用having字段。
2.再看要求有订单日期,user_id,下单次数,会员等级,因此在进行分完组后筛选这些字段要注意 sql_mode=only_full_group_by的要求,不能仅仅依靠下单时间分组
至于这个规则的通俗理解为:
当你在写这段 SQL 代码的时候,就好比你在整理一堆杂乱的书。你想要按照日期(书的出版日期)来分类统计订单数量(统计每个日期有几本书),但在这过程中,你还想记录下每个订单对应的用户 ID(每本书的作者)。
可是,MySQL 数据库有个严格的要求,它就像一个要求很严格的图书管理员。它规定:如果你要按照日期(出版日期)对书进行分类统计,那你就只能统计和日期相关的信息,比如这个日期有多少本书;或者你必须也要把作者(用户 ID)也作为分类的标准,不然它就不知道该如何正确地整理这些书。
在你的代码里,你只按照日期进行了分组统计,但还想记录用户 ID,这就违反了这个规则,所以数据库程序就会退出并报错。
为了解决这个问题,你需要明确地告诉数据库,要么按日期和用户 ID 一起分类统计,要么不要记录用户 ID,就只统计日期相关的订单数量信息。
发表于 2025-05-22 10:12:55 回复(0)
select
    date(ot.order_time) as order_date
    , ot.user_id
    , count(*) as order_nums
    , ut.vip
from
    order_tb as ot
    left join uservip_tb as ut on ot.user_id = ut.user_id
group by
    order_date
    , ot.user_id
    , ut.vip
having
    order_nums > 1

发表于 2025-05-19 17:55:53 回复(0)
select date(ot.order_time) as order_date,ot.user_id as user_id,count(ot.user_id) as order_nums,ut.vip as vip from order_tb as ot join uservip_tb as ut on ut.user_id=ot.user_id
group by date(ot.order_time),ot.user_id
having count(ot.user_id)>1
order by order_nums desc
发表于 2025-04-26 13:20:11 回复(0)
select
    date_format(order_time,'%Y-%m-%d') as order_date,
    o.user_id as user_id,
    count(distinct order_id) as order_nums,
    vip
from
    order_tb o
left join
    uservip_tb u
on
    o.user_id=u.user_id
group by order_date,user_id
having count(distinct order_id)>1
发表于 2025-04-22 15:01:47 回复(0)