Przypuśćmy, że chcemy pobrać użytkowników z bazy danych sortując ich od najnowszych, lub alfabetycznie. Może chcemy pobrać z kolumny „games” gry które są posortowane w kolejności od najdroższych do najtańszych ?
W tym celu na pewno musimy stworzyć kilka nowych kolumn:
CREATE TABLE `games` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(100) DEFAULT NULL, `price` decimal(10,2) DEFAULT NULL, `platform` varchar(100) DEFAULT NULL, `created` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) )
Bierzemy na tacę taką tabelkę z grami, posiada ona kolumny zawierające unikalny numer id, tytuł, cenę, platformę oraz datę dodania gry do bazy.
Na potrzeby bloga, każda gra może mieć jedną platformę, oczywiście w realnie tak nie jest. W rzeczywistości wykonał bym kolejną tabelę „platform” i z tą tabelą stworzył bym relacje.
Jeśli wykonamy proste zapytanie:
SELECT * FROM `games`;
Wynik otrzymamy następujący (w moim przypadku, bowiem dodałem kilka rekordów do bazy):
id | title | price | platform | created |
1 | GTA4 | 10.00 | pc | 2020-10-08 07:13:56.0 |
2 | CSGO | 99.50 | pc | 2020-10-09 13:13:58.0 |
3 | Super Mario | 59.99 | pc | 2020-10-10 12:13:59.0 |
4 | THPS2 | 18.00 | psx | 2020-10-10 13:37:08.0 |
Domyślnie baza posortowała rekordy według kolumny „id” począwszy od wartości najniższej.
Do sortowania danych, posłuży nam zapis:
SELECT * FROM {tabela} ORDER BY {kolumna} {kolejnosc}
Zapytanie jakie daliśmy poprzednio, możemy również zapisać tak:
SELECT * FROM `games` ORDER BY id ASC;
Wynik będzie identyczny jak ten powyżej, ale możemy odwrócić sortowanie zmieniająć „ASC” na „DESC”.
SELECT * FROM `games` ORDER BY id ASC;
id | title | price | platform | created |
4 | THPS2 | 18.00 | psx | 2020-10-10 13:37:08.0 |
3 | Super Mario | 59.99 | pc | 2020-10-10 12:13:59.0 |
2 | CSGO | 99.50 | pc | 2020-10-09 13:13:58.0 |
1 | GTA4 | 10.00 | pc | 2020-10-08 07:13:56.0 |
Oczywiście, sortować możemy po dowolnej kolumnie, np. alfabetycznie wykorzystując w tym celu kolumnę z tytułem gry.
SELECT * FROM `games` ORDER BY title ASC;
Teraz posortujemy rekordy zgodnie z platformą:
SELECT * FROM `games` ORDER BY platform ASC;
Ale my chcemy aby najpierw były gry z platformy „pc” i jednocześnie posortowane według ceny rosnąco, zapytanie może wyglądać następująco:
SELECT * FROM `games` ORDER BY platform, price ASC;
Wynik prezentuje się następująco:
id | title | price | platform | created |
1 | GTA4 | 10.00 | pc | 2020-10-08 07:13:56.0 |
3 | Super Mario | 59.99 | pc | 2020-10-10 12:13:59.0 |
2 | CSGO | 99.50 | pc | 2020-10-09 13:13:58.0 |
4 | THPS2 | 18.00 | psx | 2020-10-10 13:37:08.0 |
Jeśli zaś zechcemy aby platformy zostały posortowane w taki sam sposób, natomiast ceny malejąco, wykonamy zapytanie poniższe:
SELECT * FROM `games` ORDER BY platform ASC, price DESC;