Programista PHP MySQL
o programowaniu w PHP słów kilka

Podzapytania w MySQL 4.1

Opublikowano dnia Friday, 9 June 2006 przez Łukasz Jarzembowski

Właśnie odkryłem potencjał podzapytań w MySQL. Co prawda możliwość ta została wprowadzona dosyć dawno, ale do tej pory się tym nie interesowałem…

Powód był bardzo prosty - większość serwerów na których pracowałem miała zainstalowane starsze wersje. Administratorzy boją się instalować nowe wersje baz danych z kilku powodów:

  • niepewność działania - MySQL jest projektem Open Source i jest często modyfikowany. Liczebność wersji testowych, beta, rozwojowych itd. uniemożliwia wdrożenie każdej nowości na komercyjnych serwerach - byłyby zbyt częste “awarie”
  • problem z przenoszeniem danych - nowe silniki mogą inaczej interpretować pliki baz z poprzednich wersji. Najpewniejszą metodą przenoszenia jest eksport i import danych, który z kolei jest bardzo czasochłonny
  • niektóre firmy wyznają politykę - po co modyfikować coś, co dobrze działa? Wszak brak podzapytań w MySQL można było “ominąć” robiąc pętlę w PHP.

Jak używać podzapytań? Za przykład podam opracowany przeze mnie problem:

Szukamy pełnych danych (tytuł, treść, etc.) najnowszego artykułu w każdym dziale.

Używając wersji starszych niż 4.1 problem można by było rozwiązać dwojako:

  • Robimy zapytanie wyszukujące wszystkie artykuły i grupujemy je wegług działu. Następnie robimy pętlę PHP i dla każdego działu znajdujemy jeden (najnowszy) artykuł.
  • Robimy zapytanie wyszukujące daty pojawienia się najnowszych artykułów w działach - SELECT `dzial`, MAX(`data`) GROUP BY `id_dzial`. Następnie wyszukujemy te artykuły. Po odpowiednim spreparowaniu wyników poprzedniego zapytania, wyszukiwanie szczegółów tych artykułów możemy obsłóżyć “jednym selectem” (*)

Właśnie tę drugą metodę wykorzystamy do stworzenia jednego zapytania z podzapytaniem. Będzie ono wyglądało następująco:


SELECT
* FROM `artykuly` WHERE (`dzial`, `data`)
IN
(
SELECT `dzial`, MAX(`data`) FROM `artykuly` GROUP BY `dzial`
)
ORDER BY `data` DESC

Część podkreślona to właśnie podzapytanie. Mam nadzieję, że kod ten jest zrozumiały. Działa on dokładnie to samo, jak rozwiązanie (*), z tym że całe przetworzenie danych odbywa się po stronie MySQL - w PHP otrzymujemy już konkretną odpowiedź na postawiony problem. Upraszcza to bardzo skomplikowanie i czytelność kodu aplikacji.

Niestety niektóre firmy hostingowe nadal nie mają na swoich serwerach MySQL’a w wersji 4.1 lub nowszej. Dlatego polecam tę firmę - ich hosting na pewno obsługuje MySQL’a 4.1. Wiem, bo sam korzystam :-)

Jeżeli spodobał Ci się ten wpis, proszę go
lub poleć przez inne serwisy społecznościowe: dodajdo    
Łukasz Jarzembowski Łukasz Jarzembowski, autor bloga - od 2006 roku łudzi się, że będzie bogaty... ;-) ale nadal ciężko nad tym pracuje. Programuje, bloguje, i pozycjonuje, tworząc i promując swoje e-biznes­y. kontakt
 

Wpisy podobne do "Podzapytania w MySQL 4.1"

    No related posts

Skomentuj