昨天在项目中修改了一处bug,需求是查询会员档案列表,点击按生日排序,需要将即将过生日的用户由近至远的排序。

举个列子,有一张tbl_user表,表有字段birthday会员生日,birthday有7行内容为:

'2018.04.01',

'2018.04.02',

'2018.04.03',

'2018.04.04',

'2018.04.05',

'',

NULL,

今天是'2018.04.03',那么查询出的结果应为:

'2018.04.03',

'2018.04.04',

'2018.04.05',

'2018.04.01',

'2018.04.02',

'',

NULL,

思路说一下,该查询有三种解决方法
第一种解决方式是通过UNION实现,但是UNION和ORDER BY的使用,需要注意一点小事情,先UNION,后ORDER,或者用两个中间表UNION两个中间表,论坛上很多大神有详细的帖子,如参考:http://www.jb51.net/article/99842.htm
代码如下:
 SELECT * FROM(SELECT birthdayFROM tbl_user uWHERE DATE_FORMAT(birthday,'%m%d')  >= DATE_FORMAT(NOW(),'%m%d') AND birthday IS NOT NULLAND birthday != ''ORDER BY DATE_FORMAT(birthday,'%m%d') ASC ) AS t1UNIONSELECT * FROM(SELECT birthdayFROM tbl_user uWHERE DATE_FORMAT(birthday,'%m%d')  < DATE_FORMAT(NOW(),'%m%d') AND birthday IS NOT NULLAND birthday != ''ORDER BY DATE_FORMAT(birthday,'%m%d') ASC ) AS t2UNIONSELECT * FROM(SELECT birthdayFROM tbl_user uWHERE DATE_FORMAT(birthday,'%m%d')  < DATE_FORMAT(NOW(),'%m%d') AND birthday IS NULLAND birthday = ''ORDER BY DATE_FORMAT(birthday,'%m%d') ASC ) AS t3
<!--这种中间表的方法最终没能实现我的需求,但这也是一种解决方案,有大佬可以给出答案吗?可能因为是查询的同一张表的问题吗?,就如update select limit1一样-->
第二种解决方式是通过计算差值,mysql 函数DAYOFYEAR(birthday),该函数返回会员的生日是该年的第几天,然后再和今天是该年的第几天相减(DAYOFYEAR(CURDATE())),SELECT 一个中间表生成一个字段date_num,大于今天的数值不变,小于今天的加上730天,空值直接为730,ORDER BY 中间表的date_num
代码如下:
       SELECT * FROM(SELECT birthday,IF(birthday IS NULL OR birthday ='', 730,IF(DAYOFYEAR(birthday)-DAYOFYEAR(CURDATE())>=0,  DAYOFYEAR(birthday)-DAYOFYEAR(CURDATE()) , DAYOFYEAR(birthday)-DAYOFYEAR(CURDATE())+730) ) AS date_numFROM tbl_user) AS t1ORDER BY t1.date_num ASC

第三种解决方式是直接通过ORDER BY解决,需要能理解这句sql的含义,也是相当直接简洁,正确完美的解决办法

代码如下:

        SELECT birthdayFROM tbl_user ORDER BYIF(birthday IS NULL OR birthday ='', 2, IF(DATE_FORMAT(birthday,'%m.%d')>=DATE_FORMAT(NOW(),'%m.%d'), 0, 1)) ASC,(DATE_FORMAT(birthday,'%m%d') - DATE_FORMAT(NOW(),'%m%d')) ASC

还可以更逆天的排序,将已过的生日倒叙排列,代码如下:

        SELECT birthdayFROM tbl_user ORDER BYIF(birthday IS NULL OR birthday ='', 2, IF(DATE_FORMAT(birthday,'%m.%d')>=DATE_FORMAT(NOW(),'%m.%d'), 0, 1)) ASC,ABS(DATE_FORMAT(birthday,'%m%d') - DATE_FORMAT(NOW(),'%m%d')) ASC

效果如下:

好了,到这里就结束了,一个简单有意思的经典排序,发动大脑,也许你会有更多的办法,另外,有没有大神能解答下为什么union中间表order by 也没有生效?期待你的回答!

mysql 生日排序 查询生日由近到远 按照生日排序相关推荐

  1. mysql根据经纬度查询范围内数据,并根据距离排序

    最近接到一个新需求,要根据经纬度查询指定范围内的数据,并且根据距离进行排序,网上找了找相关实现方法,记录一下. java代码如下 public final class DistanceUtils {/ ...

  2. mysql篇-sql查询语句-平均分、最高最低分、排序

    以mysql为例,汇总sql查询最高分.最低分.平均分等sql语句,oracle语法类似,可自行修改以下sql语句 创建两个数据库表,一个学生表.一个考试成绩表 DROP TABLE IF EXIST ...

  3. php 距离排序,php 附近由近到远排序查询

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //获取经纬度 默认值为0.5千米 function returnSquarePoint($lng, $lat, $distance = 0.5) { d ...

  4. Mysql进阶学习(三)排序查询与常见函数

    Mysql进阶学习(三)排序查询与常见函数 一.进阶3:排序查询 1.语法: 2.特点: 3.排序方式 3.1.按单个字段排序 3.2.添加筛选条件再排序 案例:查询部门编号>=90的员工信息, ...

  5. mysql group 分页_【MySQL】条件查询之排序聚合分组分页查询

    排序查询 语法:order by 子句 order by 排序字段1 排序方式1 , 排序字段2 排序方式2... 排序方式: ASC:升序,默认的. DESC:降序. 注意: 如果有多个排序条件,则 ...

  6. MySQLi学习笔记 :二(  排序查询,聚合函数,分组查询,分页查询) 约束     多表之间的关系   范式     数据库的备份和还原

    # DQL:查询语句     1. 排序查询         * 语法:order by 子句             * order by 排序字段1 排序方式1 ,  排序字段2 排序方式2... ...

  7. go mongodb排序查询_Kotlin与MongoDB整合CURD案例详解

    1.mongodb的低版本bson无法转换类型 比如MongoDB数据库表的字段类型为Decimal,实体类用String去定义就会报如下错误 No converter found capablof ...

  8. HTAP数据库 PostgreSQL 场景与性能测试之 6 - (OLTP) 空间应用 - KNN查询(搜索附近对象,由近到远排序输出)...

    标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关 ...

  9. 黄聪mysql_黄聪:mysql查询今天,昨天,近7天,近30天,本月,上一月数据的方法

    mysql查询今天,昨天,近7天,近30天,本月,上一月数据的方法分析总结: 话说有一文章表article,存储文章的添加文章的时间是add_time字段,该字段为int(5)类型的,现需要查询今天添 ...

  10. MySQL使用 IN 查询取出数据排序问题(与in排序相同、不排序)

    MySQL使用 IN 查询取出数据排序问题(与in排序相同) 今天在项目中遇到一个问题,就是做一个最近浏览的功能,但是功能做出来了,取出数据时候要用到类似这么一条带in查询的sql语句, select ...

最新文章

  1. 学习web前端你必须要了解的主流框架!
  2. 年薪50万,副职级别!注册安全工程师的前途如此光明?
  3. java程序应用编写如何判断文本框里面的数据类型
  4. 服务器操作系统锁定设置,服务器操作系统锁定设置
  5. Web 趋势榜:上周最热门、又实用的 10 大 Web 项目 - 210813
  6. python使用redis教程 敲黑板划重点
  7. python 导入自己写的类_python中自己的类不能被导入
  8. 双水泵轮换工作原理图_周宁气压给水设备控制柜原理图
  9. java实现dex转jar,Android 逆向相关
  10. Blockchain.com,Eden Block,DACM等知名公司加入Pocket生态
  11. Iso时间转java instant,Java /将ISO-8601(2010-12-16T13:33:50.513852Z)转换为
  12. Windows Server 2012 配置 Remote Desktop Service VDI
  13. hexo博客搭建及主题优化(二)
  14. 有什么方法可以将WMV格式转换成MP4格式
  15. 性能测试流程(超级详细)
  16. OSChina 周二乱弹 —— 基于现代生物化学的长生不老药炼制教程
  17. 图片报道:2008年12月4日夜晚,暴风雪突袭烟台(上)
  18. 【新知实验室 陈林】
  19. Hexo+icarus主题配置
  20. java后台如何给数据给前端_JAVA后台 关于如何从后台传递信息在jsp前端页面显示...

热门文章

  1. 数据传输速率与带宽之间的关系
  2. 关于机器人方面的sci论文_机器人期刊_SCI
  3. 如何更改域计算机用户名和密码错误,win7加入域失败:未知的用户名或密码错误 | 绿萝...
  4. oracle isnull使用索引,isnull()用法总结
  5. Flutter技术在会展云中大显身手
  6. Unity Shader-后处理:简单的颜色调整(亮度,饱和度,对比度)
  7. java selenium回车键_JavaSelenium 模拟键盘方法封装
  8. 解决一例:“无法删除文件,无法读源文件或磁盘”
  9. 【Java项目】社区论坛项目
  10. excel两个表格数据对比_Excel跨表格数据对比