Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Grupowanie i wybór najwyższych wartości
Forum PHP.pl > Forum > Bazy danych > MySQL
legorek
Mam następującą tabelę:

pks_trasy | CREATE TABLE `pks_trasy` (
`id_przejazd` int(11) NOT NULL default '0',
`miejscowosc` varchar(50) NOT NULL default '',
`nr_przystanku` int(11) NOT NULL default '1',
PRIMARY KEY (`id_przejazd`,`nr_przystanku`),
KEY `id_przejazd` (`id_przejazd`),
KEY `nr_przystanku` (`nr_przystanku`)
) TYPE=MyISAM |

Przykładowe dane:

Kod
+------------+----------------------------------------------------+---------------+
| id_przejazd | miejscowosc                                       | nr_przystanku |
+------------+----------------------------------------------------+---------------+
|        204 | Krosno                                             |             0 |
|        204 | Korczyna                                           |             1 |
|        204 | Zmiennica                                          |             2 |
|        205 | Barwinek                                           |             0 |
|        205 | Dukla                                              |             1 |
|        205 | Krosno                                             |             2 |
|        206 | Barwinek                                           |             0 |
|        206 | Jasionka                                           |             1 |
|        206 | Krosno                                             |             2 |
+------------+----------------------------------------------------+---------------+


Chciałbym wyciągnąć nazwy miescowości pogrupowane przez (id_przejazd) ale tylko o największym nr_przystanku (tutaj jest to 2, ale może to być inna wartość).

Prawidłowy wynik:

Kod
+------------+----------------------------------------------------+---------------+
| id_przejazd | miejscowosc                                       | nr_przystanku |
+------------+----------------------------------------------------+---------------+
|        204 | Zmiennica                                          |             2 |
|        205 | Krosno                                             |             2 |
|        206 | Krosno                                             |             2 |
+------------+----------------------------------------------------+---------------+


Teraz pytanie jak zrobić to możliwe najszybciej w mysql 4.0.xx ?
Norbas
Sprawdź:
  1. SELECT id_przejazd,miejscowosc,nr_przystanku
  2. FROM pks_trasy AS t1
  3. WHERE nr_przystanku = (SELECT max(nr_przystanku)
  4. FROM pks_trasy AS t2
  5. WHERE t2.id_przejazd=t1.id_przejazd)

Twoja baza nie spełnia trzeciej postaci normalnej. IMO powinieneś zrobić tabelę 'miejscowości' i w tabeli 'pks_trasy' przechowywać tylko identyfikatory
legorek
Niestety, jak już wspomniałem MySQL jest w wersji 4.0, więc podzapytania odpadają.

Odnośnie 3NF, faktycznie nie jest spełniona, ale nie ma to w tym wypadku wilkiego znaczenia (choć może się mylę, wybaczcie jest dość późno) i pod pewnymi względami jest wygodne. Nie jest to jednak żaden problem, w każdej chwili można to zmieniać.

W każdym razie dzięki za próbę pomocy smile.gif
bendi
A może tak:
  1. SELECT id_przejazd, miejscowosc , max(nr_przystanku) FROM pks_trasy GROUP BY id_przejazd;
legorek
bendi, dzięki za pomoc, ale Twoje zapytanie jest zbyt piekne, żeby mogło być prawdziwe (czyli zbyt proste, żeby zwracało spodziewany wynik winksmiley.jpg ) Okazuje się, że na mój problem odpowiedź znajduje się w manualu (a to niespodzianka!). Wystarczy zastoswać trick MAX CONCAT

Jakby kogoś interesowało wygląda tak:
  1. SELECT id_przejazd, SUBSTRING(MAX(CONCAT(LPAD(nr_przystanku,6,'0'),miejscowosc)), 7) AS miejscowosc, 0+LEFT(MAX(CONCAT(LPAD(nr_przystanku,6,'0'),miejscowosc)), 6) AS nr_przystanku
  2. FROM pks_trasy GROUP BY id_przejazd


Na piewrwszy rzut oka sieczka, ale po chwili można zrozumieć jak działa, a działa wyśmienicie smile.gif
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.