力扣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;
posted on 2023-03-28 09:51  我不想一直当菜鸟  阅读(48)  评论(0编辑  收藏  举报