MySQL中的查询小技巧
数据表
一个简单的示例表,user_id为用户id外键,score为用户分数。
使用 CASE WHEN 自定义排序优先级
用户分数查询系统中,首页列表按照分数降序排列,即原本应是如下顺序:
出于人性化考虑,当用户进入系统时,我们希望该用户的所有得分都在最前面显示,且不影响其他记录的排序。这时可以用CASE WHEN
来自定义排序的优先级。
- 写法①:简单
CASE
语句
-- WHEN语句中的值为判断条件,THEN语句中的值为优先级(越大优先级越高)
SELECT * FROM demo ORDER BY CASE user_id WHEN 2 THEN 10 END DESC, score DESC;
- 写法②:可搜索
CASE
语句
-- 相等判断
SELECT * FROM demo ORDER BY CASE WHEN user_id = 2 THEN 10 END DESC, score DESC;
-- 范围判断
SELECT * FROM demo ORDER BY CASE WHEN (user_id > 1 AND user_id < 3) THEN 10 END DESC, score DESC;
-- 相似判断
SELECT * FROM demo ORDER BY CASE WHEN user_id LIKE "%2%" THEN 10 END DESC, score DESC;
-- 包含判断
SELECT * FROM demo ORDER BY CASE WHEN user_id IN (2) THEN 10 END DESC, score DESC;
-- 正则判断
SELECT * FROM demo ORDER BY CASE WHEN user_id REGEXP '[2]' THEN 10 END DESC, score DESC;
以上语句查询结果均为下图:
实际上,CASE还有很多妙用,用在
SELECT
作用域、用在WHERE
作用域、用在ORDER
作用域,都是可以大展身手的好地方。
-- 添加查询结果标记位,
SELECT id, user_id, score, CASE WHEN score > 90 THEN '优秀' WHEN score > 80 THEN '合格' ELSE '不合格' END AS level FROM demo ORDER BY score DESC;
-- 千人千面的判断,用户为VIP时,只要80就算优秀
SELECT id, user_id, score, '优秀' AS level FROM demo WHERE CASE WHEN user_id in (2) THEN score > 80 ELSE score > 90 END ORDER BY score DESC;
使用 FIELD 自定义排序方式
开发中或多或少会有这样的需求,用户定义了排序的方式,而且并不一定在逻辑上有序。以本博客为例,我们需要按user_id 2 →\rightarrow→ 3 →\rightarrow→ 1的顺序排列,且不影响分数倒序的基础,此时可以使用FIELD
来自定义排序方式。
-- 单列的自定义排序
SELECT * FROM demo ORDER BY FIELD(user_id, 2, 3, 1) ASC, score DESC;-- 多列的自定义排序
SELECT * , CONCAT(score, user_id) as flag FROM demo ORDER BY FIELD(flag, "822", "812", "993", "893", "921", "751") ASC, created_at DESC
注意:实际上,FIELD(str, str1, str2, str3) 返回str在比较列表中的排位,不在则返回0
使用 IF ELSE
IF
函数也能定义一些方便的查询,此处不做赘述。
SELECT id, user_id, score, IF(score > 90, '优秀', '其他') AS level FROM demo ORDER BY score DESC;
MySQL中的查询小技巧相关推荐
- Mysql中分页查询两个方法比较
mysql中分页查询有两种方式, 一种是使用COUNT(*)的方式,具体代码如下 1 2 3 SELECT COUNT(*) FROM foo WHERE b = 1; SELECT a FROM f ...
- mysql中如何求出学生人数,mysql中如何查询同时参加计算机考试和英语考试的学生人数...
mysql中如何查询同时参加计算机考试和英语考试的学生人数 mysql中如何查询同时参加计算机考试和英语考试的学生人数 mysql中如何查询同时参加计算机考试和英语考试的学生人数 学生信息表 学生成绩 ...
- mysql distinct 优化_Mysql应用分析MySQL中优化distinct的技巧
<MysqL应用分析MysqL中优化distinct的技巧>要点: 本文介绍了MysqL应用分析MysqL中优化distinct的技巧,希望对您有用.如果有疑问,可以联系我们. sql用于 ...
- mysql distinct 慢_分析MySQL中优化distinct的技巧
有这样的一个需求:select count(distinct nick) from user_access_xx_xx; 这条sql用于统计用户访问的uv,由于单表的数据量在10G以上,即使在user ...
- Linux使用及管理中的一些小技巧
Linux使用及管理中的一些小技巧 如何制作应急启动盘 在安装Linux时系统会提示制作一张应急启动盘, 这时一定要选择制作, 以便在今后 系统由于故障不能正常启动时用来恢复系统. 但有时忘了在安装时 ...
- mysql 查询最近24小时,mysql中怎么查询最近24小时、昨天、最近7天、下周、最近30天、下月的数据...
mysql中如何查询最近24小时.昨天.最近7天.上周.最近30天.上月的数据 在数据表中使用date列保存yyyy.MM.dd HH:MM:SS格式的时间记录,mysql中如何查询最近24小时.昨天 ...
- mysql中模糊查询的四种用法介绍
下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user ...
- mysql自定义序号_MySQL数据库之在mysql中给查询的结果添加序号列
本文主要向大家介绍了MySQL数据库之在mysql中给查询的结果添加序号列 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 一:第一种: select (@i:=@i+1) ...
- mysql 中模糊查询的四种用法介绍
下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...
- mysql中模糊查询的四种用法
转载自 https://www.cnblogs.com/songfayuan/articles/7290158.html 下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可 ...
最新文章
- 第6章 RTX 操作系统源码方式移植
- linux go 安装
- 软考-信息系统项目管理师-项目采购管理
- 聊聊高并发(二)结合实例说说线程封闭和背后的设计思想
- 雅虎与软银构和:拟出售雅虎日本35%股份
- Netweaver和CloudFoundry是如何运行Web应用的?
- 华为谷歌互利合作曝光:或将推Nexus手表
- c++ loadlibrary 初始化对象_C++构造函数和初始化表
- MySQL 加锁处理分析(二)
- eurekaAutoServiceRegistration 异常
- 13、XSI,信号量简介
- power-law 之Zipf
- 免费学plc的手机app_PLC学吧APP
- 第七次人口普查数据可视化分析实战——基于pyecharts(含数据和源码)
- Python写一个小小的项目监控
- java word书签_JAVA 创建移除Word书签
- iPhone 快捷指令 文本朗读
- 迅捷路由虚拟服务器设置,迅捷 FWR310 无线路由器端口映射设置指南
- 金融去杠杆环境下,请聆听麦子金服财富投资者给出的答案
- 图像风格迁移-DSTN
热门文章
- SpringBoot+H5微信登陆(网页)
- 交换机 Port-Channel(端口汇聚)的 配置
- PS 宏使用方法记录
- 记录一下学习EFCore中的基础知识
- Unknown host ‘raw.githubusercontent.com‘. You may need to adjust the proxy settings in Gradle
- Word 利用 VBA 批量设置图片格式
- (转)sonicstage 完整删除的方法
- 在团购网上空手赚钱项目,你敢做就敢赚!
- [高项]管理沟通VS控制沟通
- 【推荐】到伊甸园玩体感游戏吧!