332 PHP i MySQL dla każdego
Efektem działania podzapytania nie musi być pojedyncza wartość, jak w powyższych przykładach, ale może to być również zbiór wartości. W zapytaniu zewnętrznym niezbędne będzie w takim wypadku użycie operatora IN. Możemy zatem otrzymać np. szczegóły zamówień, które miały największą wartość, dla danego towaru. Podzapytanie pozwoli nam na wybranie zamówień o największych wartościach z podziałem na towary, a zapytanie zewnętrzne dokona złączenia tabel Zamówienia, Towary oraz Klienci. Cała instrukcja będzie miała postać:
SELECT Imię. Nazwisko. Nazwa. Data. Wartość FROM Zamówienia. Towary. Klienci WHERE Wartość IN
(SELECT MAX(Wartość) FROM Zamówienia GROUP BY Towarld)
AND Towary.Id = Zamówienia.Towarld AND Klienci.Id = Zamówienia.KlientId:
Efektem jej działania będzie tablica widoczna na rysunku 11.25.
Rysunek 11.25.
Podzapytanie wybierające wiele wartości
mysql> SELECT Imię, Nazwisko, Nazwa, Data, Wartość -> FROM Zamówienia, Towary, Klienci -> WHERE Wartość IN
-> (SELECT MAX(Wartosc) FROM Zamówienia GROUP BY Towarld) -> AND Towary.Id = Zamówienia.Towarld -> AND Klienci.Id = 2amowienia.KlientId;
Imię I Nazwisko | Nazwa | Data |
Wartość | |||
Andrzej Andrzej łan Jan Janusz |
Nowak Nowak Kowalski Kowalski Malinowski |
Śruby Nakrętki Nakrętki _ Płaskowniki |
2005-01-01 2005-02-12 2005-01-01 200S-02-12 2005-01-01 |
22.35 22.35 12.44 15.88 12.44 |
5 rows in set (0.00 sec)
Dotychczas prezentowane podzapytania były wykonywane tylko raz podczas wywołania zapytania głównego, czyli najpierw było wywoływane podzapytanie, jego wynik był wstawiany do zapytania głównego, a następnie było wykonywane zapytanie główne. Zupełnie inaczej wygląda sytuacja w przypadku podzapytań skorelowanych. Są one wykonywane dla każdej wartości analizowanej przez zapytanie główne (fachowo: dla każdej krotki przetwarzanej przez zapytanie zewnętrzne). Ich cechą charakterystyczną jest odwołanie w zapytaniu skorelowanym do kolumny tabeli występującej w zapytaniu głównym. Jeśli w obu zapytaniach występuje ta sama tabela, niezbędne jest użycie aliasu. Zobaczmy to na przykładzie. W tym celu przygotujemy zmodyfikowaną wersję tablicy Towary, zawierającą następujące dane:
Id | Nazwa |
| Grupa | Cena | |
1 | Śruby |
| 1 | 2.00 | |
2 | Nakrętki |
| 1 | 3.00 | |
3 | Kątowniki |
j 2 | 8.00 | |
4 j Płaskowniki |
| 2 | 9.00 j |
5 j Gwoździe |
1 I 1.00 I |
6 | Panele |
| 3 1 15.00 1 |