假設我們有乙個名為items的
表,包含兩列:id
和item_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列:prefix
和suffix
。prefix
列儲存item_no的
數字部分,suffix
列儲存item_no
的字母部分。然後,我們可以根據prefix
和suffix
列對資料進行排序,如下所示:
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...