2016-05-04 94 views
-3

我需要您的幫助。僅使用MySQL進行自然排序

我們正在爲客戶開發一個電子商務項目,現在我們需要使用MySQL的自然排序對產品進行排序(我們不能通過使用natsort ,因爲我們使用延遲加載,所以我們必須只)

需要解決類似下面的例子(但是從MySQL)

http://php.net/manual/en/function從MySQL數據進行排序。natsort.php

更多清晰度:這是我想要分類的原始數據。

 INSERT INTO `sample` (`id`, `data`) VALUES 
(1, 'MLB-1.0-6.0-2.5'), 
(2, 'MLB-1.0-6.0-3'), 
(3, 'MLB-1.0-7.0-2'), 
(4, 'MLB-1.0-7.0-2.5'), 
(5, 'MLB-1.0-7.0-3'), 
(6, 'MLB-1.0-9.0-2.5'), 
(7, 'MLB-1.0-10.0-2'), 
(8, 'MLB-1.0-10.0-2.5'), 
(9, 'MLB-1.0-8.0-3'), 
(10, 'MLB-1.0-9.0-2.5'), 
(11, 'MLB-1.0-10.0-2'), 
(12, 'MLB-1.0-10.0-2.5'), 
(13, 'MLB-1.0-10.0-3'), 
(14, 'MLB-1.0-12.0-2.5'), 
(15, 'MLB-1.0-12.0-3'), 
(16, 'MLB-1.2-10.0-2'), 
(17, 'MLB-1.2-10.0-3'), 
(18, 'MLB-1.2-10.0-4'), 
(19, 'MLB-1.2-10.0-5'), 
(20, 'MLB-1.2-11.2-2'), 
(21, 'MLB-1.2-11.2-3'), 
(22, 'MLB-1.2-11.2-4'), 
(23, 'MLB-1.2-12.0-2'), 
(24, 'MLB-1.2-12.0-2.5'), 
(25, 'MLB-1.2-12.0-3'), 
(26, 'MLB-1.2-12.0-4'), 
(27, 'MLB-1.2-12.0-5'), 
(28, 'MLB-1.2-12.0-6'), 
(29, 'MLB-1.2-12.0-8'), 
(30, 'MLB-1.2-12.7-3'), 
(31, 'MLB-1.2-14.0-2.5'), 
(32, 'MLB-1.2-14.0-3'), 
(33, 'MLB-1.2-4.0-2.5'), 
(34, 'MLB-1.2-4.0-3'), 
(35, 'MLB-1.2-5.0-2'), 
(36, 'MLB-1.2-5.0-2.5'), 
(37, 'MLB-1.2-5.0-3'), 
(38, 'MLB-1.2-6.0-2'), 
(39, 'MLB-1.2-6.0-2.5'), 
(40, 'MLB-1.2-14.0-4'), 
(41, 'MLB-1.2-14.0-5'), 
(42, 'MLB-1.2-16.0-3'), 
(43, 'MLB-1.2-16.0-4'), 
(44, 'MLB-1.2-16.0-5'), 
(45, 'MLB-1.2-19.0-3'), 
(46, 'MLB-1.2-19.0-4'), 
(47, 'MLB-1.2-22.0-3'), 
(48, 'MLB-1.2-22.0-4'), 
(49, 'MLB-1.2-6.0-3'), 
(50, 'MLB-1.2-6.0-4'), 
(51, 'MLB-1.2-6.0-5'), 
(52, 'MLB-1.2-6.0-6'), 
(53, 'MLB-1.2-7.0-2'), 
(54, 'MLB-1.2-7.0-2.5'), 
(55, 'MLB-1.2-7.0-3'), 
(56, 'MLB-1.2-7.0-4'), 
(57, 'MLB-1.2-8.0-2'), 
(58, 'MLB-1.2-8.0-2.5'), 
(59, 'MLB-1.2-8.0-2/2.5B'), 
(60, 'MLB-1.2-8.0-3'), 
(61, 'MLB-1.2-8.0-4'), 
(62, 'MLB-1.2-8.0-5'), 
(63, 'MLB-1.2-8.0-6'), 
(64, 'MLB-1.2-8.0-8'), 
(65, 'MLB-1.2-9.0-2'), 
(66, 'MLB-1.2-9.0-2.5'), 
(67, 'MLB-1.2-9.0-3'), 
(68, 'MLB-1.2-9.0-4'); 

這是排序後我預期的結果:

 
MLB-1.0-6.0-2.5 
MLB-1.0-6.0-3 
MLB-1.0-7.0-2 
MLB-1.0-7.0-2.5 
MLB-1.0-7.0-3 
MLB-1.0-8.0-2 
MLB-1.0-8.0-2.5 
MLB-1.0-8.0-3 
MLB-1.0-9.0-2.5 
MLB-1.0-10.0-2 
MLB-1.0-10.0-2.5 
MLB-1.0-10.0-3 
MLB-1.0-12.0-2.5 
MLB-1.0-12.0-3 
MLB-1.2-4.0-2.5 
MLB-1.2-4.0-3 
MLB-1.2-5.0-2 
MLB-1.2-5.0-2.5 
MLB-1.2-5.0-3 
MLB-1.2-6.0-2 
MLB-1.2-6.0-2.5 
MLB-1.2-6.0-3 
MLB-1.2-6.0-4 
MLB-1.2-6.0-5 
MLB-1.2-6.0-6 
MLB-1.2-7.0-2 
MLB-1.2-7.0-2.5 
MLB-1.2-7.0-3 
MLB-1.2-7.0-4 
MLB-1.2-8.0-2 
MLB-1.2-8.0-2.5 
MLB-1.2-8.0-2/2.5B 
MLB-1.2-8.0-3 
MLB-1.2-8.0-4 
MLB-1.2-8.0-5 
MLB-1.2-8.0-6 
MLB-1.2-8.0-8 
MLB-1.2-9.0-2 
MLB-1.2-9.0-2.5 
MLB-1.2-9.0-3 
MLB-1.2-9.0-4 
MLB-1.2-10.0-2 
MLB-1.2-10.0-2.5 
MLB-1.2-10.0-3 
MLB-1.2-10.0-4 
MLB-1.2-10.0-5 
MLB-1.2-11.2-2 
MLB-1.2-11.2-3 
MLB-1.2-11.2-4 
MLB-1.2-12.0-2 
MLB-1.2-12.0-2.5 
MLB-1.2-12.0-3 
MLB-1.2-12.0-4 
MLB-1.2-12.0-5 
MLB-1.2-12.0-6 
MLB-1.2-12.0-8 
MLB-1.2-12.7-3 
MLB-1.2-14.0-2.5 
MLB-1.2-14.0-3 
MLB-1.2-14.0-4 
MLB-1.2-14.0-5 
MLB-1.2-16.0-3 
MLB-1.2-16.0-4 
MLB-1.2-16.0-5 
MLB-1.2-19.0-3 
MLB-1.2-19.0-4 
MLB-1.2-22.0-3 
MLB-1.2-22.0-4 

下面的解決方案已經嘗試過: http://skybluesofa.com/blog/how-implement-natural-sorting-mysql/ http://www.copterlabs.com/natural-sorting-in-mysql/

請提出這個使用MySQL解決方案。

+1

提供良好的人DB模式和預期結果。 –

+0

我們需要類似這個例子的解決方案,但使用MySQL。 http://php.net/manual/en/function。natsort.php –

回答

0

根據您發佈的數據,我認爲這將有助於:

SELECT * 
FROM sample 
ORDER BY CAST(SUBSTRING(SUBSTRING_INDEX(`data`, '-', 2), 5) AS double), 
    CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, '-', 3), '-', -1) AS double), 
    SUBSTRING_INDEX(`data`, '-', -1); 

哪些查詢確實是使用'-'作爲分隔符,並提取數字部分,即拆分數據列中,從''MLB-1.2-4.0-2.5'提取物1.2,4.02.5,將它們轉換爲double(除了最後一個塊)並由它們對數據進行排序。

0

基於此example並假設data列將具有您發佈的格式(具有3個破折號作爲分隔符的字符串)。

select *,SUBSTRING_INDEX(SUBSTRING_INDEX(data,"-",3),"-",-1) as mystring from sample ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(data,"-",2),"-",-1)+0, SUBSTRING_INDEX(SUBSTRING_INDEX(data,"-",3),"-",-1)+0, SUBSTRING_INDEX(data,"-",-1); 

SQL Fiddle