Sztuczki pomagające lepiej sortować

Indeks


Sortowanie naturalne

Załóżmy następującą tabelę z danymi (bardzo często spotykaną w róznych wnioskach)

id numer
1 1/2016
2 2/2016
3 11/2016
4 4/2016
5 24/2016

Jak wybrać stąd wiersze sortując po numerze? Najprościej i najoczywiściej wykonując następujące zapytanie:

SELECT `numer` FROM `tabela` ORDER BY `numer`;

Co zwróci taki zestaw danych

numer
1/2016
11/2016
2/2016
24/2016
4/2016

Jednak nie o to chodziło prawda? Wystarczy prosta zmiana sortowania

SELECT `numer` FROM `tabela` ORDER BY LENGTH(`numer`), `numer`;

I wynik jest taki jak trzeba

numer
1/2016
2/2016
4/2016
11/2016
24/2016

Sortowanie sum z nullami

Załóżmy następującą tabelę z danymi

id wartosc grupa
1 NULL A
2 4,2 A
3 3 B
4 1,45 B
5 NULL C
6 NULL C
7 0 D

Naszym zadaniem jest wyliczenie łącznej wartości grup i posortowanie według tej sumy rosnąco. Typowe zapytanie będzie wyglądac tak:

SELECT SUM(`wartosc`) AS `suma`, `grupa` FROM `tabela` GROUP BY `grupa` ORDER BY `suma`;

suma grupa
NULL C
0 D
4,2 A
4,45 B

Grupa C, która na chwilę obecną ma nieokreślone jeszcze wartości pojawia się na początku listy, nie jest to najlepsze rozwiązanie (w zależności od założeń takie rozwiązanie może być tolerowane, jednakże np. w MyShop podczas wyliczania odległości sklepu od użytkownika i sortowaniu po najbliższych sklepach nikt by nie chciał, aby sklepy z niepodanymi współrzędnymi pokazywały się jako najbliższe, kiedy faktycznie mogą być nawet na drugiej półkuli).

W celu rozwiązania tego problemu można zastosować sztuczkę, posortować malejąco (co wywali nulle na koniec) według ujemnej wartości (co zaneguje efekt sortowania malejąco).

SELECT SUM(`wartosc`) AS `suma`, `grupa` FROM `tabela` GROUP BY `grupa` ORDER BY -`suma` DESC;

suma grupa
0 D
4,2 A
4,45 B
NULL C