当前位置: 首页 > 知识库问答 >
问题:

SQL版本MySQL 5.5中的排序列

辛建业
2023-03-14

我正在使用MySQL5.5版本编写SQL查询来进行排序。我的问题是无法正确使用SQL查询下面的列name排序。

select t.id,t.name
from
(
select t.*, cast((case when col1_col2_ref > 0 
                      then 
                        substring_index(modified_name,'-',1)
                  else 
                     modified_name
                  end
                  ) as unsigned) col1
          , cast((case when    col1_col2_ref > 0
                           and col3_ref > 0
                       then 
                          substr(modified_name,(col1_col2_ref + 1),(col3_ref - (col1_col2_ref + 1)))
                       when col1_col2_ref > 0
                       then 
                         substr(modified_name,(col1_col2_ref + 1))
                  end) as unsigned) col2
          , cast((case when    col3_ref > 0
                           and col4_ref > 0
                       then 
                         substr(modified_name,(col3_ref + 1),(col4_ref - (col3_ref + 1)))
                       when col3_ref > 0
                       then 
                         substr(modified_name,(col3_ref + 1))
                  end) as unsigned) col3
          , cast((case when col4_ref > 0
                        then 
                         substr(modified_name,(col4_ref + 1))
                   end) as unsigned) col4
from
(
select t.*,substring_index(name,' ',1) modified_name
          ,locate('-',name,1) col1_col2_ref
          ,locate('/',name,1) col3_ref
          ,locate('/',name,locate('/',name,1)+1) col4_ref
  from filing_code_management t
) t
) t
order by col1,col2,col3,col4

这是我的数据库链接,显示我的排序错误https://dbfiddle.uk/?rdbms=mysql_5.5&fiddle=bcb32a6b47d0d5b061fd401d0888bdc3

实际上,我想对列name模式进行排序,如下所示:

id  |  name
33     100 PENTADBIRAN
40     100-1 Perundangan
46     100-1-1 Penggubalan/Penyediaan/Pindaan Undang-Undang/Peraturan
48     100-1/1/1 Undang-Undang Kecil Kerja Di Jalan 1996
49     100-1/1/2 Undang-Undang Kecil Peruntukan Mengenai Lesen Bersesama (Majlis Perbandaran Klang) 1992
264    100-6 Pengurusan Mesyuarat
265    100-6-1 Mesyuarat Dalam Jabatan
266    100-6-1-1 Mesyuarat Penuh Bulanan  SUP
267    100-6-1-2 Mesyuarat Khas Belanjawan JKEW
303    100-6-2 Mesyuarat Luar Jabatan
304    (S)100-6-2-1 Mesyuarat Dewan Undangan Negeri JKK
305    (R)100-6-2-2 Mesyuarat Majlis Kerajaan Negeri (MMKN) JKK
306    (S)100-6-2-3 Mesyuarat Tindakan Ekonomi Selangor (MTES) SUP
455    100-7 Kemudahan (Fasiliti)
456    100-7-1 Tempahan/Penggunaan Premis Ibu Pejabat dan Cawangan JKP
457    100-7-1-1 Bilik Mesyuarat/Auditorium

我的错误排序在MySQL5.5的结果,它不能正确排序在表。

错误

希望有人能指导我解决这个问题。多谢了。

共有1个答案

爱刚捷
2023-03-14

这里有一个查询,我认为它将按您所希望的顺序排序。最里面的子查询在第一个空格处拆分name字段;删除结果开头()中包含的任何文本,然后用-替换/。外部的子查询将结果字符串拆分为-上的1到4个部分,条件聚合用于将这些值放入col1col2col3col4中。然后将此子查询连接到主表的id字段,结果按col1col4排序:

select t.*
from filing_code_management t
join (
select id,
       CAST(MAX(CASE WHEN f.n = 1 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(modified_name, '-', f.n), '-', -1) END) AS UNSIGNED) col1,
       CAST(MAX(CASE WHEN f.n = 2 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(modified_name, '-', f.n), '-', -1) END) AS UNSIGNED) col2,
       CAST(MAX(CASE WHEN f.n = 3 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(modified_name, '-', f.n), '-', -1) END) AS UNSIGNED) col3,
       CAST(MAX(CASE WHEN f.n = 4 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(modified_name, '-', f.n), '-', -1) END) AS UNSIGNED) col4
from
(
select t.id, replace(substr(substring_index(t.name,' ',1), locate(')', substring_index(t.name,' ',1))+1), '/', '-') modified_name
  from filing_code_management t
) t
join (select 1 n union all select 2 union all select 3 union all select 4) f
  on length(replace(t.modified_name, '-', '')) <= length(t.modified_name) - f.n + 1
group by id
) c on t.id = c.id
order by c.col1, c.col2, c.col3, c.col4

dbfiddle演示

 类似资料:
  • 问题内容: 我有一个表,存储的版本如下 我的要求是我需要对它们进行排序,以便输出为 但是,如果通过简单的命令不能按预期工作 需要帮助 问题答案: 实施大脑解决方案

  • 问题内容: 在Oracle中,仅使用不会对版本号进行排序。我的字段被声明为a,并且无法更改。例如:以下版本: 应该排序为 我研究了几篇文章,但似乎都没有真正达到我的目的,或者答案是针对SQL Server等的,而不是针对Oracle的。我碰到了这个看起来很有效的特定sql。 以这种方式对版本进行排序: 我相信此sql语句适用于: 但是,这不适用于Oracle。在Oracle中,hierarchyi

  • 问题内容: 是否可以在SQL中使用hibernate方式对集合进行排序,而无需使用接口,不使用注释-仅使用条件的addOrder。 我试过了,它添加了order by子句,但是集合没有排序。 我使用hibernate3.4。 问题答案: NHibernate Set没有“ order”,即使set映射支持order- by。请参阅Ayende的说明: 请注意,[order-by]不适用于通用集,并

  • 问题内容: 我得到以下结果 我要订购最近发生的事件。供应商具有最新的事件,因此应该首先与同一供应商的所有其他事件一起发生,然后是所有事件均按降序排列的下一个供应商。期望的结果是这样的- 没有给出期望的输出。有什么帮助吗? 问题答案: 使用分析功能: 请参阅: http: //docs.oracle.com/javadb/10.8.2.2/ref/rrefsqlj13658.html http://

  • 问题内容: 有一段时间遇到这个麻烦。 我有这样的数据库: 我要执行搜索,找到最便宜的汽车,然后按价格升序订购其余相同品牌的汽车。 我希望我的输出是这样的: 最便宜的汽车是福特嘉年华(Forest Fiesta),因此,其余福特车型都按照价格直接订购。然后,本田拥有第二便宜的车型,因此爵士车和其他本田车紧随其后,依此类推。 这可能吗? 问题答案: 您需要做的是创建一个瞬态数据集,该数据集包含car_

  • 问题内容: STRINGS.txt的示例内容: 是否可以仅使用bash对所有这些版本字符串进行排序,而最新版本位于顶部? 问题答案: 这是可能的,但工作量却很愚蠢。如果您使用GNU排序: …将完全按照您的要求进行。 现在,如果您 真的 没有任何外部工具,那么您将遇到麻烦。Freenode的#bash IRC频道上的BlastHardcheese已在本机bash中编写了以下quicksort算法,出