力扣578(MySQL)-查询回答率最高的问题(中等)
题目:
从 survey_log 表中获得回答率最高的问题,survey_log 表包含这些列:id, action, question_id, answer_id, q_num, timestamp。
id 表示用户 id;action 有以下几种值:“show”,“answer”,“skip”;当 action 值为 “answer” 时 answer_id 非空,而 action 值为 “show” 或者 “skip” 时 answer_id 为空;q_num 表示当前会话中问题的编号。
请编写 SQL 查询来找到具有最高回答率的问题。
示例:
解题思路:
最开始没读懂题意,看了别人的题解才知道,一个题号有一个答题流程,当题目出现时(show)-选手选择回答或者跳过(answer/skip)-下一题出现(show)-选手选择回答或跳过(answer/skip)--...每个题目出现以后,选手只能在回答和跳过中选择一种。
①先算出题目回答answer的总数和题目show出现的总数
1 select question_id, 2 sum(if(action='answer',1,0)) as ans_num, 3 sum(if(action='show',1,0)) as cout_num 4 from survey_log 5 group by question_id;
②在计算出回答率,降序排序,取出第一条数据中的question_id。
1 select question_id 2 from ( 3 select question_id, 4 sum(if(action='answer',1,0)) as ans_num, 5 sum(if(action='show',1,0)) as cout_num 6 from survey_log 7 group by question_id 8 ) as temp 9 order by ans_num / cout_num desc 10 limit 1;
小知识:
①MySQL中的if:
IF(expr1,expr2,expr3) -- 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。
②limit n 等价于 limit 0 , n :从第一行开始取,共取 n 行;
limit n offset m :跳过前m行,从m+1行开始取,一共取n行。
limit m ,n == limit n offset m; -- 跳过前m行,从m+1行开始取,一共取n行
limit n == limit 0,n;
标签:
MySQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)