Skoro jesteśmy już po obejrzeniu znanego teleturnieju, to możemy na fali emocji wykorzystać następne pół godziny i również pobawić się w sumowanie liczb. Dziś o sumie skumulowanej oraz diagramie pana Pareto.
Skoro jesteśmy już po obejrzeniu znanego teleturnieju, to możemy na fali emocji wykorzystać następne pół godziny i również pobawić się w sumowanie liczb. Dziś o sumie skumulowanej oraz diagramie pana Pareto.
Zajmiemy się wyszukiwaniem w JSON-ie. Nie będzie to jednak tytułowy bohater powyższego filmu (całe szczęście, choć film wart obejrzenia), ale typ pola w bazie MySQL. Mamy z nim do czynienia od wersji 5.7.8. Charakterystyki tego typu nie będę Ci opisywał, ale pokażę jego specyficzne zachowanie i praktyczny przykład okiełznania tego zachowania.
Na warsztat weźmiemy przykładowe dane w postaci JSON:
Zapewne miałeś do czynienia z potrzebą wstawienia rekordu jeśli go brak i ewentualnej aktualizacji jeśli takowy istnieje. To takie dwie pieczenie na jednym. Ta zabawa nad ogniskiem w języku SQL nazywa się UPSERT (UPDATE+INSERT). Ale dziś nie o genezie tego słowa, ale praktycznym użyciu i to nie w przypadku aktualizacji jednego rekordu, ale całej masy naraz.
Czy czasem wyobrażasz siebie drapiącego się w głowę kiedy w Twoich myślach kłębi się pytanie: czy dałoby się prościej zapisać to zapytanie? Rzeczywiście minę można mieć nietęgą, adekwatną do problemu. Aby nie wpadać więcej na taką minę pokażę Ci dziś kilka prostych porad.
Jesteśmy w profilu użytkownika. Ten może zmienić hasło. Jeśli pole zostawi puste, nie chcemy oczywiście zapisywać w bazie danych hasła pustego (hash pustego!), lecz pozostawić aktualne. Czyli chcemy jednym zapytaniem zaktualizować część danych, a część pozostawić bez zmian.
You can't have your cake and eat it...
Zapytanie przestawne pozwala nam na obrócenie wyniku zapytania o 90 stopni i zamianę niektórych wierszy w kolumny (trochę jak rozkładanie parasola). Na skrzyżowaniu nowopowstałych kolumn oraz pozostałych wierszy otrzymujemy wartości z kolumn, których nie wykorzystaliśmy ani do wierszy ani do kolumn. Prostym przykładem niech będzie tabela mecz gdzie przechowujemy nazwiska graczy, numery meczów oraz ilość strzelonych goli, czyli mamy kolumny: gracz, mecz, polowa, gole. Za pomocą tabeli przestawnej chcemy uzyskać czytelniejszy widok: będziemy mieć wiersze z nazwiskami, kolumny odpowiadające poszczególnym meczom, a komórki będą zawierać sumę strzelonych goli.
Czyli z tabeli:
gracz | mecz | polowa | gole |
---|---|---|---|
marek | 1 | 1 | 2 |
zdzisiek | 1 | 1 | 1 |
marek | 1 | 2 | 3 |
heniek | 1 | 1 | 1 |
heniek | 2 | 2 | 1 |
zdzisiek | 2 | 1 | 1 |
marek | 3 | 2 | 2 |
heniek | 3 | 1 | 1 |
heniek | 3 | 2 | 1 |
zdzisiek | 3 | 2 | 3 |
chcemy otrzymać:
gracz | mecz1 | mecz2 | mecz3 |
---|---|---|---|
heniek | 1 | 1 | 2 |
marek | 5 | 0 | 2 |
zdzisiek | 1 | 1 | 3 |
W systemach bazodanowych Oracle czy też MSSQL mamy dostępne operatory PIVOT, ale my najczęściej zajmujemy się na tym blogu MySQL, więc fajnie by było przyjrzeć się temu operatorowi w tymże systemie.
Przyjrzałeś się? Bo ja się przyglądałem i nie znalazłem. Niestety póki co ten operator jest niedostępny.
Zrobimy pivot?! Namówiłeś!