Podzapytania w MySQL 4.1
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
Wpisy podobne do "Podzapytania w MySQL 4.1"
- No related posts