【Mysql】sql语句查询在2025-10-15以后,同一个用户下。。。

牛客的课程订单分析(三)

http://www.nowcoder.com/questionTerminal/4ae8cff2505f4d7cb68fb0ec7cf80c57

题目描述:sql语句查询在2025-10-15以后,同一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程的订单信息,并且按照order_info的id升序排序。
个人思路:与(二)几乎一样。不过的是因为要显示的所有信息因此不能直接使用group by后的结果。
方法一:内表找出user_id,外表找出该user_id符合的记录。

with moreThan1 as 
(
    select user_id
    from order_info
    where datediff(date,"2025-10-15")>0
      and product_name in ("C++","Java","Python")
      and status ="completed"
    group by user_id
    having count(id)>1
)

select *
from order_info
where datediff(date,"2025-10-15")>0
      and product_name in ("C++","Java","Python")
      and status="completed"
      and user_id in (select * from moreThan1)
order by id;

或者这么写

select *
from order_info
where datediff(date,"2025-10-15")>0
      and product_name in ("C++","Java","Python")
      and status="completed"
      and user_id in (
                      select user_id
                      from order_info
                      where datediff(date,"2025-10-15")>0
                          and product_name in ("C++","Java","Python")
                          and status ="completed"
                      group by user_id
                      having count(id)>1
                     )
order by id;

方法二:窗口函数

select t1.id, t1.user_id,t1.product_name,t1.status,t1.client_id,t1.date
from
(
    select *,count(id) over(partition by user_id) as number
    from order_info
    where datediff(date,"2025-10-15")>0
      and status ="completed"
      and product_name in ("C++","Java","Python")
) t1
where t1.number >1
order by t1.id

用count()作为窗口函数来检索以user_id分组的行数并作为临时表的新列。然后对临时表按题目要求依次添加筛选条件。关于为什么t1.number要放在外表where后进行判断。因为count()属于聚合函数在临时表t1里无法放在where后进行判断。但是在外表number是一个列的字段名,其值可以直接拿来进行判断。但更主要的原因还是mysql的执行顺序:开始->from子句->where子句->group by子句->having子句->select子句->最终结果。

牛客题霸-SQL篇【Mysql】 文章被收录于专栏

少壮不努力,老大勤刷题

全部评论
select * from order_info where product_name in ('C++', 'Java', 'Python') and status ='completed'and date>'2025-10-15' and user_id in ( select user_id from order_info where product_name in ('C++', 'Java', 'Python') and status ='completed'and date>'2025-10-15' group by user_id having count(user_id)>1) t 这里有t(对子句进行命名)的情况下 报错,如果把t删除掉,又可以正常运行。请问为什么会出现这种情况呢? 以下是报错时候的系统提示: 执行出错 程序异常退出, 请检查代码"是否有数组越界等异常"或者"是否有语法错误" SQL_ERROR_INFO: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't' at line 12"
1 回复 分享
发布于 2023-07-26 14:30 澳大利亚
想请问下,在方法二中用窗口函数生成的那个表里,除了多了一个number列外其他信息都与答案一致,为什么在做为被查询表后不加任何条件的情况下查询的结果不一样呢?就是这样: select t1.id, t1.user_id,t1.product_name,t1.status,t1.client_id,t1.date from ( select *,count(id) over(partition by user_id) as number from order_info where datediff(date,"2025-10-15")>0 and status ="completed" and product_name in ("C++","Java","Python") ) t1 order by t1.id
点赞 回复 分享
发布于 2021-04-15 17:31
请问方法二中,窗口函数如果使用count(user_id) over(partition by user_id)会有什么不同吗?我试验了下,无法通过测试,但是无法理解为什么... select tbl.id, tbl.user_id, tbl.product_name, tbl.status, tbl.client_id, tbl.date from ( select *, count(user_id) over(partition by user_id) as cnt from order_info where date >= '2025-10-10' and status = 'completed' and product_name in ('C++', 'Java', 'Python') ) tbl where tbl.cnt>=2 order by tbl.id
点赞 回复 分享
发布于 2021-07-10 04:35
请问一下,为什么方法一中 select user_id from order_info where datediff(date,"2025-10-15")>0 and product_name in ("C++","Java","Python") and status ="completed" group by user_id having count(id)>1 要加上日期那些条件,不能直接group by吗?(虽然我知道是错的,但是脑子了想不通为什么不能直接接写group by作为子查询,因为后续这些条件有被提了一次?)
点赞 回复 分享
发布于 2022-02-16 18:16
请问一下,聚合函数在窗口函数中,是对自身记录、及位于自身记录以上的数据进行运算的结果,也就是说如果窗口函数用product_name分组,那么number就会出现1、2的情况。为什么用t1.number>1可以完整找出符合要求的订单数>=2的2条结果,而不是1条结果?
点赞 回复 分享
发布于 2022-03-06 23:35
大佬,请帮忙看下我的思路错在哪里, 根据题目的条件,我们需要过滤出的订单信息要满足 1.日期在2025-10-15以后 2.同一个用户下单2个以及2个以上 3.订单状态为成功 4.课程为C++,JAVA,PYTHON之一 根据这四个条件写出过滤语句结果如下: select * from order_info where user_id in (select user_id from order_info group by user_id having count(*)>=2 )------筛选下单两次及以上的用户的订单 and status='completed'----筛选订单状态为成功的订单 and product_name in('C++','Python','Java')----筛选课程为这三门之一的订单 and date>='2025-10-15'----筛选下单日期为2025-10-15之后的订单 order by id; 该答案执行报错,输出结果和答案不符,对比正确答案: select * from order_info where user_id in (select user_id from order_info where status='completed' and product_name in('C++','Python','Java') and date>='2025-10-15' group by user_id having count(*)>=2 ) and status='completed' and product_name in('C++','Python','Java') and date>='2025-10-15' order by id; 问题出在筛选条件1,正确答案在筛选条件1:下单2单以上的用户时所用的子查询里是 ①筛选成功下单2单以上,且符合产品筛选条件和日期筛选条件的用户后,再加上②筛选产品③筛选日期。 可是我感觉我的思路好像也没问题呀,①筛选下了两单以上的用户,②筛选成功的订单,③筛选产品,④筛选日期,这几个筛选条件的交集应该符合题目需求才对。为啥会输出错误呢?
点赞 回复 分享
发布于 2022-03-18 14:54
select * from order_info where date>'2025-10-15' and status='completed' and product_name in ('C++','Java','Python') and user_id in (select user_id from order_info group by user_id having count(user_id)>=2) 我这个比较简单
点赞 回复 分享
发布于 2022-10-29 09:45 天津
select * from order_info where user_id in ( select user_id from order_info where status='completed' and date>'2025-10-15' and product_name in ('C++','Java','Python') group by user_id having count(status)>=2 ) order by id 请问为什么这样写结果不对呢
点赞 回复 分享
发布于 05-23 15:53 英国
为啥聚合函数用row_number不行啊
点赞 回复 分享
发布于 10-25 11:22 安徽

相关推荐

66 7 评论
分享
牛客网
牛客企业服务