Kawałek Kodu

Programistyczne porady na luzie

JSON where are you?! Czyli przechowywanie struktury JSON w MySQL i unikanie problemów.

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:

Czytaj dalej

Gęsiego, gęsiego, czyli o INSERT i UPDATE ON DUPLICATE

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.

Czytaj dalej

A co, jeśli? Czyli o upraszczaniu IF w MySQL

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.

Czytaj dalej

Always UPDATE to data, czyli jak UPDATE'ować jeśli brak części danych.

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...

Czytaj dalej

Chodźmy na pivot, czyli o zapytaniach przestawnych w MySQL

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, polowagole. 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ś!

Czytaj dalej

Zaraz obydwu ustawię do pionu! Czyli o złączeniach pionowych w MySQL

Łączyliśmy już w lewo, prawo i w obydwie strony. Nie łączyliśmy jeszcze w górę i w dół, czyli pionowo. Dziś właśnie o łączeniu pionowym wyników, czyli o UNION, UNION ALL, INTERSECT oraz EXCEPT (MINUS). Inaczej nazywamy je złączeniami na zbiorach.
A dlaczego w ogóle określenie "pionowe"? Bo operujemy na dwóch lub więcej zbiorach uzyskanych z kolejnych, występujących jeden pod drugim, zapytaniach. Czyli łączymy w dół.

UNION i UNION ALL zapewne już znasz z MySQL i być może nawet je stosowałeś. Operator UNION pozwala na połączenie wyników uzyskanych z X (X>1, bo głupio robić UNION na jednym zapytaniu) zapytań. W przypadku UNION będzie to suma wyników bez powtórzeń, a w przypadku UNION ALL duplikaty mogą spać spokojnie.

Przykładowe tabele:

klient1:

id_klient login
1 marek
2 zdzisiek
3 heniek

klient2:

id_klient login
1 marek
3 heniek
4 janek

i zapytanie:

SELECT * FROM klient1 AS k1
UNION /* lub UNION ALL */
SELECT * FROM klient2 AS k2

Wynik z UNION:

id_klient login
1 marek
2 zdzisiek
3 heniek
4 janek

Wynik z UNION ALL:

id_klient login
1 marek
2 zdzisiek
3 heniek
1 marek
3 heniek
4 janek

O ile UNION i UNION ALL występują w MySQL natywnie, to co z INTERSECT oraz EXCEPT?

Czytaj dalej