2016-05-04 8 views
-3

私はあなたの助けが必要です。MySQLを使用したNaturalソート

クライアント用の電子商取引プロジェクトを1つ開発していますが、今度はMySQLの自然なソートを使用してソートする必要があります(PHPで配列を並べ替えることはできません)私たちが遅延ロードを使用しているので、我々は唯一のMySQLからデータをソートする必要がある)

例以下のような(しかし、MySQLのから)ソリューション何か

http://php.net/manual/en/functionが必要です。natsort.php

もっと分かりやすくするために、これは並べ替えたいRawデータです。

 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.0および2.5は、それらをダブル(最後のチャンクを除く)に変換し、それらによってデータを注文する。

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

関連する問題