MYSQL資料排序(九)自然排序

2021-08-20 13:25:28 字數 2443 閱讀 5799

假設我們有乙個名為items的表,包含兩列:iditem_no。要建立items表,我們使用create table語句,sql語句如下:

create

table

ifnot

exists items (

id int auto_increment primary

key,

item_no varchar(255) not

null

);

我們使用insert語句將一些資料插入到items表中:

insert

into items(item_no)

values ('1'),

('1c'),

('10z'),

('2a'),

('2'),

('3c'),

('20d');

當我們查詢資料並按照item_no進行排序時,我們得到以下結果:

這不是我們希望看到的結果。我們預期的結果如下:

這被稱為自然排序。不幸的是,mysql不提供任何內建的自然排序語法或函式。

為了實現以上排序規則,首先我們將item_no列分成2列:prefixsuffixprefix列儲存item_no的數字部分,suffix列儲存item_no的字母部分。然後,我們可以根據prefixsuffix列對資料進行排序,如下所示:

select

concat(prefix, suffix)

from

items

order

by prefix , suffix;

sql語句首先按prefix排序,然後按suffix排序。這樣我們得到預期的排序結果。

這個解決方案的缺點是我們必須在插入或更新item_no之前將它分成兩部分。另外,當我們查詢資料時,我們必須將兩列合併成一列。

如果item_no資料是相當標準的格式,您可以使用以下sql查詢實現自然排序而不更改表結構。

select 

item_no

from

items

order

bycast(item_no as unsigned) , item_no;

在這個sql語句中,首先我們使用型別轉換將item_no轉換為無符號整數。然後,我們使用order by子句首先按數字順序排序,然後按字母順序排序。

讓我們來看看我們經常需要處理的另一組常見資料。

truncate

table items;

insert

into items(item_no)

values('a-1'),

('a-2'),

('a-3'),

('a-4'),

('a-5'),

('a-10'),

('a-11'),

('a-20'),

('a-30');

排序後的預期結果如下:

為了實現這個結果,我們可以使用length函式。請注意,length函式返回字串的長度。其想法是按照item_no欄位長度首先對結果集進行排序,然後按item_no欄位值對結果集進行排序:

select 

item_no

from

items

order

by length(item_no) , item_no;

這樣就實現了自然排序。

如果上面的方法不能解決自然排序, 那麼,您需要在應用程式層中執行自然排序。一些語言支援自然排序功能,例如,php提供了對陣列使用自然排序演算法的函式natsort()

mysql自然排序是什麼 MySQL 自然排序

mysql 自然排序 簡介 在本教程中,您將使用order by子句了解mysql中的各種自然排序技術。讓我們用示例資料開始教程。假設我們有乙個名為items包含兩列的表 id和item no。要建立items表,我們使用create table語句,如下所示 create table if not...

PHP標準排序和自然排序

在自然排序演算法中,數字 2 小於 數字 10。在計算機標準排序演算法中,10 小於 2,因為 10 中的第乙個數字小於 2。舉例 temp files array temp15.txt temp10.txt temp1.txt temp22.txt temp2.txt sort temp file...

mysql資料怎麼排序 mysql排序資料

一 order by的普通使用 1.介紹 當使用select語句查詢表中的資料時,結果集不按任何順序進行排序。要對結果集進行排序,請使用order by子句。order by子句允許 對單個列或多個列排序結果集。按公升序或降序對不同列的結果集進行排序。使用方式 select column1,colu...