Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL] Grupowanie danych
adasiu
post 16.07.2010, 09:44:28
Post #1





Grupa: Zarejestrowani
Postów: 65
Pomógł: 7
Dołączył: 18.01.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
H4eX
post 16.07.2010, 09:52:22
Post #2





Grupa: Zarejestrowani
Postów: 150
Pomógł: 15
Dołączył: 1.07.2010

Ostrzeżenie: (0%)
-----


  1. SELECT nazwisko, przedmiot, MAX(wynik), MIN(wynik) FROM test
  2. GROUP BY nazwisko


?

Ten post edytował H4eX 16.07.2010, 09:52:40
Go to the top of the page
+Quote Post
adasiu
post 16.07.2010, 09:55:06
Post #3





Grupa: Zarejestrowani
Postów: 65
Pomógł: 7
Dołączył: 18.01.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
krzysiej
post 16.07.2010, 15:30:01
Post #4





Grupa: Zarejestrowani
Postów: 25
Pomógł: 3
Dołączył: 5.08.2009

Ostrzeżenie: (0%)
-----


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.  
Go to the top of the page
+Quote Post
Demongod
post 16.07.2010, 17:41:42
Post #5





Grupa: Zarejestrowani
Postów: 11
Pomógł: 2
Dołączył: 25.06.2010

Ostrzeżenie: (0%)
-----


  1. SELECT nazwisko, MAX(wynik), MIN(wynik), przedmiot FROM test GROUP BY nazwisko, przedmiot
Go to the top of the page
+Quote Post
adasiu
post 20.07.2010, 09:53:07
Post #6





Grupa: Zarejestrowani
Postów: 65
Pomógł: 7
Dołączył: 18.01.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


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.

Ten post edytował adasiu 20.07.2010, 09:53:36
Go to the top of the page
+Quote Post
kasztan165
post 4.08.2010, 14:31:18
Post #7





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 18.07.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
skarabe.pl
post 4.08.2010, 15:48:18
Post #8





Grupa: Zarejestrowani
Postów: 142
Pomógł: 49
Dołączył: 29.07.2010

Ostrzeżenie: (0%)
-----


  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;
Go to the top of the page
+Quote Post
kasztan165
post 5.08.2010, 09:18:36
Post #9





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 18.07.2007

Ostrzeżenie: (0%)
-----


Czy jest możliwość zrobienia tego bez użycia podzapytań, przez grupowanie ewentualnie joinem?
Go to the top of the page
+Quote Post
skarabe.pl
post 5.08.2010, 12:22:30
Post #10





Grupa: Zarejestrowani
Postów: 142
Pomógł: 49
Dołączył: 29.07.2010

Ostrzeżenie: (0%)
-----


Co masz przeciwko podzapytaniom?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 31.07.2025 - 10:26