Rozdział 7: Sortowanie danych

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

idtitlepriceplatformcreated
1GTA410.00pc2020-10-08 07:13:56.0
2CSGO99.50pc2020-10-09 13:13:58.0
3Super Mario59.99pc2020-10-10 12:13:59.0
4THPS218.00psx2020-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;
idtitlepriceplatformcreated
4THPS218.00psx2020-10-10 13:37:08.0
3Super Mario59.99pc2020-10-10 12:13:59.0
2CSGO99.50pc2020-10-09 13:13:58.0
1GTA410.00pc2020-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:

idtitlepriceplatformcreated
1GTA410.00pc2020-10-08 07:13:56.0
3Super Mario59.99pc2020-10-10 12:13:59.0
2CSGO99.50pc2020-10-09 13:13:58.0
4THPS218.00psx2020-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;