2016-05-04 11 views
-3

Ich brauche deine Hilfe.Natürliche Sortierung mit nur MySQL

Wir entwickeln ein eCommerce-Projekt für den Kunden und jetzt müssen wir Sortierung von Produkten mit natürlicher Sortierung von MySQL durchführen (Wir können nicht sortieren, indem wir Array mit PHP sortieren, indem wir natsort verwenden , weil wir faul Laden verwenden, so müssen wir nur Daten aus MySQL sortieren)

Need Lösung so etwas wie unten Beispiel (aber von MySQL)

http://php.net/manual/en/function. natsort.php

Für mehr Klarheit: das ist meine Rohdaten, die ich sortieren möchte.

 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'); 

Das ist mein erwartetes Ergebnis nach dem Sortieren:

 
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 

Below Lösung bereits versucht: http://skybluesofa.com/blog/how-implement-natural-sorting-mysql/ http://www.copterlabs.com/natural-sorting-in-mysql/

Bitte legen nahe, Lösungen für diesen Einsatz von MySQL.

+1

die gut Leuten das DB-Schema Geben und Ergebnisse erwartet. –

+0

Wir brauchen eine Lösung wie dieses Beispiel, aber mit MySQL. http://php.net/manual/en/funktion.natsort.php –

Antwort

0

Basierend auf den Daten, die Sie geschrieben, ich denke, das wird helfen:

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); 

Was die Abfrage tut, ist die Daten Spalte '-' als Trennzeichen und Extrahieren der numerischen Teile, dh von ''MLB-1.2-4.0-2.5' Extrakte aufzuspalten 1.2, 4.0 und 2.5, konvertiert sie zu Double (mit Ausnahme des letzten Chunks) und sortiert die Daten nach ihnen.

0

Basierend auf dieser example und vorausgesetzt, data Spalte wird das Format, das Sie gebucht haben, (eine Zeichenfolge, die 3 Bindestriche als Trennzeichen hat).

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

Verwandte Themen