Kawałek Kodu

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:

{"zdjecie_profilowe": "janek.jpg", "imie": "Jan", "nazwisko": "Iskiński"}

Jak widzimy klucze nie są ułożone w kolejności alfabetycznej i dokładnie w takiej postaci chcemy przechować nasze dane. A dlaczego? Załóżmy, że użytkownik ma możliwość ułożenia kolejności pól formularza (klucze) i zapisania go wraz z danymi (wartości), które potem będą odtwarzane również w takiej kolejności. Czy JSON jest odpowiedni dla przechowywania takich danych, pozostawimy na razie bez dyskusji (możesz wymyśleć inny, praktyczniejszy przykład).

Jason, what are you doing here?

Co się stanie kiedy takie dane wstawimy do tabeli? Wartości zostaną posortowane w kolejności alfabetycznej.

{"imie": "Jan", "nazwisko": "Iskiński", "zdjecie_profilowe": "janek.jpg"}

Oczywiście nie satysfakcjonuje nas takie rozwiązanie, bo chcemy mieć zachowaną kolejność, tak aby przy generowaniu formularza ustawić je w oryginalnej, zdefiniowanej przez użytkownika kolejności.

Jason! I was lookin' for ya.

Nic nie stoi na przeszkodzie, aby zmienić typ pola na TEXT i w takim polu przechowywać nasze dane. Co lepsze, funkcja JSON_EXTRACT nadal działa. Możemy jej więc bezproblemowo użyć w klauzuli WHERE, wybierając dane z kolumny.

Nasze dane:

dane
{"nazwisko": "Iskiński", "zdjecie_profilowe": "janek.jpg", "imie": "Jan"}
{"imie": "Jan", "zdjecie_profilowe": "janek_y.jpg", "nazwisko": "Ygrekowski"}
{"zdjecie_profilowe": "kalina.jpg", "nazwisko": "Malina", "imie": "Kalina"}

Jeśli na powyższych wykonamy zapytanie:

SELECT * FROM product WHERE JSON_EXTRACT(test, '$.imie')='Jan'

Otrzymamy:

dane
{"nazwisko": "Iskiński", "zdjecie_profilowe": "janek.jpg", "imie": "Jan"}
{"imie": "Jan", "zdjecie_profilowe": "janek_y.jpg", "nazwisko": "Ygrekowski"}

czyli rekordy, które chcieliśmy i nadal w oryginalnej postaci.

Niestety dzisiejszy wpis dotyczył szukania po kieszeniach Jason'a, a nie Grześka. Gdy w MySQL pojawi się typ GRZESIEK, nim też się zajmiemy.
Do przeczytania!

 

Przydatne linki:
Typ JSON w MySQL
Funkcje do obsługi typu JSON w MySQL