mysql - MySQL按字段的子字符串排序
问题描述
无法修改非常旧的数据库,因此最终用户没有添加“customType”字段,而是“发明”了一种对项目进行分类的方法。详细地说,如果描述字段:
- 以
*
它的开头type1
- 以
#
它的开头type2
- 以
**
它的开头type3
- 否则,它的
type4
现在,我被要求生成一些按“类别”字段排序但按类型分组的报告。现在,除了将查询分成 4 个部分,果然我可以做到,我想知道我是否可以在一个查询中做到这一点。
如果存在“customType”字段,则查询将很简单:
SELECT * FROM item ORDER BY customType, category
但不幸的是我做不到。我的第一次尝试是这样的
SELECT * FROM item ORDER BY SUBSTRING(description,2), category
但问题是我(正确地)将按类型分组的项目放在一起,但类别并没有放在一起。更清楚地说,我想有一个像
aaaaa|cat1
ddddd|cat1
bbbbb|cat2
ccccc|cat2
#aaaa|cat5
#bbbb|cat5
但现在我得到
aaaaa|cat1
bbbbb|cat2
ccccc|cat2
ddddd|cat1
#aaaa|cat5
#bbbb|cat5
如您所见,cat1/cat2 混淆了,类别应该保持在一起
解决方案
您可以尝试按CASE
表达式排序:
SELECT *
FROM item
ORDER BY
CASE WHEN LEFT(description, 2) = '**' THEN 3
WHEN LEFT(description, 1) = '*' THEN 1
WHEN LEFT(description, 1) = '#' THEN 2
ELSE 4 END,
category;
请注意,我们在检查以 开头的描述**
之前检查以 开头的描述*
。这是为了避免**
在与刚刚开始的相同的桶中错误分类开始*
。
推荐阅读
- java - 在 JMPS 模块化应用程序中运行 Spring Boot 测试代码时出错
- java - 如何使用 Spring Boot 设置自定义登录?
- javascript - React Native StyleSheet.create 异常
- python-3.x - 多个基地在机器人框架中存在实例布局冲突
- bash - 根据条件修改bash命令的功能
- reactjs - 在 React 中全局使用 Socket.IO?
- elasticsearch - ElasticSearch 无法从字符串转换为 ElasticClient.searchRequestparameters
- javascript - 在悬停某些文本时在表格单元格上使用工具提示时出现问题。并且需要被表头固定
- spring-boot - 无法在应用引擎标准环境 (GCP) 中部署预构建映像
- c - 如何连接 LPTSTR 与 char 数组?