mysql 自然排序
簡介:在本教程中,您將使用order by子句了解mysql中的各種自然排序技術。
讓我們用示例資料開始教程。
假設我們有乙個名為items包含兩列的表:id和item_no。要建立items表,我們使用create table語句,如下所示:
create table if not 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資料並對其進行排序時,我們得到以下結果:
select
item_no
from
items
order by item_no;
| item_no |
| 1 |
| 10z |
| 1c |
| 2 |
| 20d |
| 3c |
6 rows in set (0.00 sec)
這不是我們的預期。我們希望看到如下結果:
| item_no |
| 1 |
| 1c |
| 2 |
| 3c |
| 10z |
| 20d |
6 rows in set, 4 warnings (0.00 sec)
這稱為自然分選。不幸的是,mysql沒有提供任何內建的自然排序語法或功能。在order by子句對線性方式,即字串,每次乙個字元,從第乙個字元開始。
為了解決這個問題,首先我們將item_no列拆分為2列:prefix和suffix。prefix列儲存數字部分,而suffix列儲存字母部分。然後,我們可以根據這些列對資料進行排序,如下所示:
select
concat(prefix, suffix)
from
items
order by prefix , suffix;
查詢首先按數字對資料進行排序,然後按字母順序對資料進行排序。我們得到了預期的結果。
這種解決方案的缺點是我們必須item_no在插入或更新之前將其分成兩部分。另外,在選擇資料時,我們必須將兩列合二為一。
如果item_no資料採用相當標準的格式,則可以使用以下查詢執行自然排序,而無需更改表結構。
select
item_no
from
items
order by cast(item_no as unsigned) , item_no;
在此查詢中,首先我們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');
排序後的預期結果如下:
| item_no |
| a-1 |
| a-10 |
| a-11 |
| a-2 |
| a-20 |
| a-3 |
| a-30 |
| a-4 |
| a-5 |
9 rows in set, 9 warnings (0.00 sec)
為了達到這個結果,我們可以使用length函式。請注意,length函式返回字串的長度。我們的想法是先按item_no長度排序資料,然後按列值排序,如下面的查詢:
select
item_no
from
items
order by length(item_no) , item_no;
排序的結果為:
| item_no |
| a-1 |
| a-2 |
| a-3 |
| a-4 |
| a-5 |
| a-10 |
| a-11 |
| a-20 |
| a-30 |
9 rows in set (0.01 sec)
如您所見,資料自然排序。
如果以上所有解決方案都不適合您。您需要在應用程式層中執行自然排序。有些語言支援自然排序功能,例如,php提供了natsort() 函式使用自然排序演算法對陣列進行排序。
在本教程中,我們向您展示了在mysql中執行自然排序的各種技術。
mysql是什麼 MySQL是什麼?(一)
在學習mysql之前,首先需要了解資料庫和sql。如果您已經知道資料庫和sql,那麼可以直接跳轉到下一章節的學習。1.資料庫簡介 當您拍攝 並將其上傳到微博,朋友圈等,這樣的社交網路中的帳戶時,您的 庫就有可能儲存在乙個資料庫中。當您瀏覽電子商務 購買鞋子,衣服等時,您使用購物車就是資料庫應用。資料...
mysql db是什麼 MySQL是什麼?
在學習mysql之前,首先需要了解資料庫和sql。如果您已經知道資料庫和sql,那麼可以直接跳轉到下一章節的學習。1.資料庫簡介 當您拍攝 並將其上傳到微博,朋友圈等,這樣的社交網路中的帳戶時,您的 庫就有可能儲存在乙個資料庫中。當您瀏覽電子商務 購買鞋子,衣服等時,您使用購物車就是資料庫應用。資料...
mysql 死鎖是什麼 mysql死鎖是什麼意思
mysql死鎖是指兩個或多個事務在同一資源上相互占用,並請求鎖定對方占用的資源,從而導致惡性迴圈。innodb儲存引擎能檢測到死鎖的迴圈依賴並立即返回乙個錯誤。只有部分或完全回滾其中乙個事務,才能打破死鎖。什麼是死鎖?它是如何產生的?死鎖是指兩個或多個事務在同一資源上相互占用,並請求鎖定對方占用的資...