Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] Grupowanie danych
Forum PHP.pl > Forum > Przedszkole
adasiu
Witam,

Mam następujący problem. Posiadam bazę ze studentami, którzy posiadają oceny z danych przedmiotów. Wygląda to następująco:
  1. CREATE TABLE IF NOT EXISTS `test` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `nazwisko` varchar(255) NOT NULL,
  4. `przedmiot` varchar(55) NOT NULL,
  5. `wynik` double(2,1) NOT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=9 ;
  8.  
  9. INSERT INTO `test` (`id`, `nazwisko`, `przedmiot`, `wynik`) VALUES
  10. (1, 'Nowak', 'Matematyka', 3.5),
  11. (2, 'Nowak', 'Fizyka', 4.0),
  12. (3, 'Nowak', 'Metodyka', 4.5),
  13. (4, 'Nowak', 'Programowanie', 3.5),
  14. (5, 'Kowalska', 'Programowanie', 4.5),
  15. (6, 'Kowalska', 'Matematyka', 3.5),
  16. (7, 'Kowalska', 'Fizyka', 3.0),
  17. (8, 'Kowalska', 'Metodyka', 5.0);


I teraz potrzebuję wyciągnąć najlepszą i najgorszą ocenę czyli:
  1. SELECT nazwisko, MAX(wynik), MIN(wynik) FROM test
  2. GROUP BY nazwisko

A czy da się dopisać do tego przedmioty z których zostały uzyskane te oceny, czyli tak żeby była wyświetlana najlepsza ocena oraz przedmiot z którego została uzystkana i najgorsza ocena i przedmiot.

Z góry dziękuję za pomoc,
Pozdrawiam.
H4eX
  1. SELECT nazwisko, przedmiot, MAX(wynik), MIN(wynik) FROM test
  2. GROUP BY nazwisko


?
adasiu
Tylko, że w tym wypadku zostanie wyświetlony pierwszy przedmiot od góry dla każdej z grupowanych osób, a mnie interesują przedmioty z których została uzyskana najgorsza i najlepsza ocena.
krzysiej
ja bym to zrobil tak
  1.  
  2. SELECT przedmiot, wynik FROM test WHERE wynik = (SELECT max(wynik) FROM test) OR wynik = (SELECT min(wynik) FROM test)
  3.  
Demongod
  1. SELECT nazwisko, MAX(wynik), MIN(wynik), przedmiot FROM test GROUP BY nazwisko, przedmiot
adasiu
Chciałem uzyskać wynik w formie:
nazwisko, max_uzyskany_wynik, przedmiot_max_uzyskanego_wyniku, min_uzyskany_wynik, przedmiot_min_uzyskanego_wyniku
Czy takie coś można uzyskać poprzez samo grupowanie??

Pozdrawiam.
kasztan165
Mam podobny problem, czy zna ktoś odpowiedź na ten problem?
Widocznie jest to zbyt trudne więc wnioskuje o przeniesienie tematu do działu Bazy danych
skarabe.pl
  1. SELECT v.*,
  2. (SELECT group_concat(t_max.przedmiot)
  3. FROM `test` t_max
  4. WHERE t_max.nazwisko = v.nazwisko
  5. AND t_max.wynik = v.max_wynik) max_przedmiot,
  6. (SELECT group_concat(t_min.przedmiot)
  7. FROM `test` t_min
  8. WHERE t_min.nazwisko = v.nazwisko
  9. AND t_min.wynik = v.min_wynik) min_przedmiot
  10. FROM( SELECT t.nazwisko ,
  11. MAX(t.wynik) max_wynik,
  12. MIN(t.wynik) min_wynik
  13. FROM `test` t
  14. GROUP BY t.nazwisko) v;
kasztan165
Czy jest możliwość zrobienia tego bez użycia podzapytań, przez grupowanie ewentualnie joinem?
skarabe.pl
Co masz przeciwko podzapytaniom?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.