创建表格
CREATE TABLE `t_product` (
`c_id` varchar(32) NOT NULL COMMENT 'ID',
`c_name` varchar(200) NOT NULL COMMENT '产品名称',
`c_create_time` datetime NOT NULL COMMENT '创建时间',
`c_del` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标识',
PRIMARY KEY (`c_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='产品'
t_product 是产品表,id是32为UUID。
按照创建时间倒叙查询SQL:
SELECT * FROM t_product ORDER BY c_create_time DESC;
结果如下图:
有些场景下,需要把特定的产品置顶,而其他的产品还是安装原先的顺序排列。那么我们执行下面的SQL:
SELECT
c_id, c_name, c_create_time, c_del,
(
CASE
WHEN c_id='9a4c8f8196b311ebbeda1c3947c61214' THEN 0
WHEN c_id='a5547dad96b311ebbeda1c3947c61214' THEN 1
WHEN c_id='6d2ffa5696b411ebbeda1c3947c61214' THEN 2
ELSE 999
END
) c_sort
FROM t_product ORDER BY c_sort ASC, c_create_time DESC;
查询结果如图:
注意:
如果你使用 mybatis 框架,需要注意两点:
- 置顶的数据id以列表的形式传入sql的xml中。使用 foreach 标签来循环生成 WHEN… THEN…语句。
- 引用参数的时候因为是在列上,需要使用
${item}
、${index}
而不能使用井号;否则mybatis报错。你需要在业务上保证传入的参数是安全的,防止sql注入。c_sort 部分的代码类似下面这种:
(
CASE
<foreach collection="idList" item="item" open="" close="" separator=" " index="index">
WHEN c_id='${item}' THEN ${index}
</foreach>
WHEN c_id='-1' THEN 999
ELSE 999
END
) c_sort