首页 > 解决方案 > MySQL按字段的子字符串排序

问题描述

无法修改非常旧的数据库,因此最终用户没有添加“customType”字段,而是“发明”了一种对项目进行分类的方法。详细地说,如果描述字段:

现在,我被要求生成一些按“类别”字段排序但按类型分组的报告。现在,除了将查询分成 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 混淆了,类别应该保持在一起

标签: mysqlsorting

解决方案


您可以尝试按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;

请注意,我们在检查以 开头的描述**之前检查以 开头的描述*。这是为了避免**在与刚刚开始的相同的桶中错误分类开始*


推荐阅读