文章大纲

mysql按照指定顺序对数据排序该怎么写

2020-03-10 23:53:02

翟码农现在有一个需求:如果当天创建了很多分类的文章,文章的展示必须按照指定的文章分类来排序,mysql该怎么写?


主要涉及知识点:

order by field(列名, 值1,值2,值3...)


方便测试,翟码农从数据库里挑出了8条数据进行测试,数据insert语句如下,大家可以拿去做测试用:

INSERT INTO `coderzhai_news` (`news_id`, `title`, `cate_id`, `create_time`) VALUES (1, '轰,幸福消逝的声音', 2, 1501394153);
INSERT INTO `coderzhai_news` (`news_id`, `title`, `cate_id`, `create_time`) VALUES (2, '我的小叔', 1, 1501394154);
INSERT INTO `coderzhai_news` (`news_id`, `title`, `cate_id`, `create_time`) VALUES (3, '土豆诔', 1, 1501394155);
INSERT INTO `coderzhai_news` (`news_id`, `title`, `cate_id`, `create_time`) VALUES (4, '归乡旅馆', 2, 1501394156);
INSERT INTO `coderzhai_news` (`news_id`, `title`, `cate_id`, `create_time`) VALUES (5, 'LNMP环境部署(非编译安装)', 9, 1501394157);
INSERT INTO `coderzhai_news` (`news_id`, `title`, `cate_id`, `create_time`) VALUES (6, '从前想长大,如今想从前', 1, 1502115760);
INSERT INTO `coderzhai_news` (`news_id`, `title`, `cate_id`, `create_time`) VALUES (7, '知己,一句顶一万句;陌路,一句也顶一万句', 2, 1502115761);
INSERT INTO `coderzhai_news` (`news_id`, `title`, `cate_id`, `create_time`) VALUES (8, '珍惜这个夏天,尽管她要离开你', 9, 1502115762);


数据按news_id排序如下所示:



现在要将7月30号的数据和8月7号的数据,都按分类2-9-1来排序,完整sql如下:

SELECT news_id,title,cate_id, from_unixtime(create_time) 
FROM coderzhai_news n
ORDER BY LEFT(FROM_UNIXTIME(create_time),10) ASC, FIELD(cate_id,2,9,1)

其中LEFT(FROM_UNIXTIME(create_time),10)意思是,先将日期转换成“yyyy-mm-dd hh:ii:ss”格式,然后截取左边10个字符按升序排序,即按年月日时间递增排序。


最终执行结果如下:



正好实现了翟码农的需求。


现将测试数据news_id=3的cate_id改为5,将news_id=4的cate_id改为4,即不在上面指定的2,9,1这些值里,那么上面语句执行的结果会如何呢?


结果如下图所示:



经过实践,会发现:

对应列值不在指定顺序里的数据记录,将优先排列,无其它排序条件的话,则默认按照主键id递增排序

本文为翟码农个人博客里mysql分类下有关数据排序的原创文章,转载请注明出处:http://www.zhai14.com/blog/how-to-sort-data-according-to-an-arranged-data-list-in-mysql.html




我要评论
评论列表