当前位置: 首页 > news >正文

【MySQL】ALL函数的巧用 以及 排序(order by)巧用 sum(条件表达式) 语法

力扣题

1、题目地址

578. 查询回答率最高的问题

2、模拟表

SurveyLog 表:

Column NameType
idint
actionENUM
question_idint
answer_idint
q_numint
timestampint
  • 这张表可能包含重复项。
  • action 是一个 ENUM(category) 数据,可以是 “show”、“answer” 或者 “skip” 。
  • 这张表的每一行表示:ID = id 的用户对 question_id 的问题在 timestamp 时间进行了 action 操作。
  • 如果用户对应的操作是 “answer” ,answer_id 将会是对应答案的 id ,否则,值为 null 。
  • q_num 是该问题在当前会话中的数字顺序。

3、要求

回答率 是指:同一问题编号中回答次数占显示次数的比率。

编写一个解决方案以报告 回答率 最高的问题。如果有多个问题具有相同的最大 回答率 ,返回 question_id 最小的那个。

查询结果如下例所示。

示例 1:

输入:
SurveyLog table:

idactionquestion_idanswer_idq_numtimestamp
5show285null1123
5answer2851241241124
5show369null2125
5skip369null2126

输出:

survey_log
285

解释:
问题 285 显示 1 次、回答 1 次。回答率为 1.0 。
问题 369 显示 1 次、回答 0 次。回答率为 0.0 。
问题 285 回答率最高。

4、代码编写

我的写法

SELECT question_id AS survey_log
FROM (SELECT question_id, SUM(action = 'answer')/SUM(action = 'show') AS qFROM SurveyLogGROUP BY question_id
) AS one
WHERE q >= ALL(SELECT SUM(action = 'answer')/SUM(action = 'show') AS qFROM SurveyLogGROUP BY question_id
)
ORDER BY question_id
LIMIT 1

代码解析:

1、先算出问题各自的回答率(sum(条件表达式) 只要里面条件表达式是 true 就加一,和 count 作用一样)

SELECT question_id, SUM(action = 'answer')/SUM(action = 'show') AS q
FROM SurveyLog
GROUP BY question_id

2、求出回答率是最高的问题

WHERE q >= ALL(SELECT SUM(action = 'answer')/SUM(action = 'show') AS qFROM SurveyLogGROUP BY question_id
)

ALL 函数的效果可以理解成(这是 ALL 前面是 >= 或 > 的情况,如果ALL前面是 <= 或 < 的情况,则是 MIN)

SELECT MAX(q)
FROM (SELECT SUM(action = 'answer')/SUM(action = 'show') AS qFROM SurveyLogGROUP BY question_id
) AS one

还有一个 ANY 函数,与 ALL 函数相反(ANY 前面是 >= 或 > 的情况,是 MIN,如果 ANY 前面是 <= 或 < 的情况,则是 MAX)

具体可参考:MySQL 中 ALL 和 ANY 的用法
参考里面注意看评论,参考里面最后一个例子看着是有误的

网友写法

SELECT question_id AS survey_log
FROM SurveyLog
GROUP BY question_id
ORDER BY SUM(action = 'answer')/SUM(action = 'show') DESC , question_id
LIMIT 1

代码解析:

1、分组已经决定了后面出来的条数,我们要取出满足条件的放在前面,然后取一条即可(LIMIT 1),这就需要用到排序。

2、排序的话,我们知道是要 回答率高 的放在前面,SUM(action = 'answer')/SUM(action = 'show') 就是算出回答率,DESC 倒序

  • 后面按要求如果 最大回复率没有重复,直接取第一条即可
  • 后面按要求如果 最大回答率有重复,则按 question_id 正序排后,再取第一条即可

相关文章:

  • Qt之explicit作用及用法
  • HTTP与API接口详解
  • Vue2-子传父和父传子的基本用法
  • React基础应用及常用代码
  • 修改 docker /dev/shm 的大小
  • k8s之Pod的基础(上)
  • studio3T mongodb 根据查询条件更新字段 或 删除数据
  • 离散数学1
  • 推荐几个免费的HTTP接口Mock网站和工具
  • 每日coding
  • Android低功耗蓝牙开发总结
  • vue 组件之间通信的方式
  • 2023年“此星光明”的编程之旅——让技术分享成为你生活的一部分
  • Prometheus实战篇:Prometheus监控mongodb
  • QT DAY2 作业
  • hexo+github搭建个人博客
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Babel配置的不完全指南
  • create-react-app项目添加less配置
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • PHP的Ev教程三(Periodic watcher)
  • Vue组件定义
  • 搞机器学习要哪些技能
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 手写一个CommonJS打包工具(一)
  • 思否第一天
  • 王永庆:技术创新改变教育未来
  • 云大使推广中的常见热门问题
  • 阿里云ACE认证之理解CDN技术
  • ​虚拟化系列介绍(十)
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # Java NIO(一)FileChannel
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #pragma once
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • %check_box% in rails :coditions={:has_many , :through}
  • (20050108)又读《平凡的世界》
  • (分享)自己整理的一些简单awk实用语句
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (一一四)第九章编程练习
  • (转)linux下的时间函数使用
  • *2 echo、printf、mkdir命令的应用
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Core中的去虚
  • .Net的DataSet直接与SQL2005交互
  • .NET轻量级ORM组件Dapper葵花宝典
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .Net组件程序设计之线程、并发管理(一)
  • [ linux ] linux 命令英文全称及解释
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [Angular 基础] - 指令(directives)
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [BZOJ4010]菜肴制作
  • [C++] sqlite3_get_table 的使用