Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Skomplikowane łączenie tabel + sortowanie
Forum PHP.pl > Forum > Bazy danych > MySQL
londyn123
Witam na forum.

Piszę managera piłkarskiego on-line. Własnie stanełem przed napisaniem tabeli drużyn.
Myślę już nad tym dobrych parę godzin i wymyśliłem tylko coś takiego:
  1. SELECT *
  2. FROM kluby,
  3. terminarz AS t
  4. WHERE kluby.id_grupa='1' AND kluby.dywizja='1' AND kluby.liga='1' AND (t.id_gospodarz=kluby.id OR t.id_gosc=kluby.id)
  5. GROUP BY nazwa


Oto potrzebne tabele:

Tabela TERMINARZ:
  1. CREATE TABLE `terminarz` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `stan` SET('0','1','2') NOT NULL DEFAULT '1',
  4. `kolejka` tinyint(4) NOT NULL DEFAULT '0',
  5. `id_gospodarz` int(11) NOT NULL DEFAULT '0',
  6. `id_gosc` int(11) NOT NULL DEFAULT '0',
  7. `bramki_gospodarz` tinyint(4) NOT NULL DEFAULT '0',
  8. `bramki_gosc` tinyint(4) NOT NULL DEFAULT '0',
  9. `widownia` int(11) NOT NULL DEFAULT '0',
  10. `data` int(11) NOT NULL DEFAULT '0',
  11. KEY `id` (`id`)
  12. ) TYPE=MyISAM COMMENT='STAN: 0-niezaakceptowany(spar), 1-zaakceptowany, 2-rozgrany' AUTO_INCREMENT=5 ;


Tabela KLUBY:
  1. CREATE TABLE `kluby` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `typ` SET('nieaktywny','ban','aktywny','pro','mod','admin') NOT NULL DEFAULT 'nieaktywny',
  4. `id_grupa` smallint(6) NOT NULL DEFAULT '0',
  5. `dywizja` SET('0','1','2','3','4') NOT NULL DEFAULT '0',
  6. `liga` tinyint(4) NOT NULL DEFAULT '0',
  7. `login` char(15) NOT NULL DEFAULT '',
  8. `haslo` char(15) NOT NULL DEFAULT '',
  9. `email` char(30) NOT NULL DEFAULT '',
  10. `nazwa` char(20) NOT NULL DEFAULT '',
  11. `manager` char(30) NOT NULL DEFAULT '',
  12. `mktime_rejestracja` int(11) NOT NULL DEFAULT '0',
  13. `mktime_logowanie` int(11) NOT NULL DEFAULT '0',
  14. `stadion_nazwa` char(25) NOT NULL DEFAULT '',
  15. `stadion_msc_stojace` int(11) NOT NULL DEFAULT '500',
  16. `stadion_msc_siedzace` int(11) NOT NULL DEFAULT '500',
  17. `stadion_msc_vip` int(11) NOT NULL DEFAULT '10',
  18. `pieniadze` int(11) NOT NULL DEFAULT '50000',
  19. `sponsor_id` tinyint(4) NOT NULL DEFAULT '0',
  20. `sponsor_koniec_umowy` int(11) NOT NULL DEFAULT '0',
  21. `zadowolenie_kibicow` tinyint(4) NOT NULL DEFAULT '0',
  22. `id_taktyka` int(11) NOT NULL DEFAULT '0',
  23. `id_trening` int(11) NOT NULL DEFAULT '0',
  24. `godlo` char(50) NOT NULL DEFAULT '',
  25. KEY `id` (`id`)
  26. ) TYPE=MyISAM AUTO_INCREMENT=20 ;


Chcę aby zapytanie zwracało 8 drużyn, w kolejności od największej ilości punktów.
free
Cytat
Chcę aby zapytanie zwracało 8 drużyn, w kolejności od największej ilości punktów.

aby to uzyskac musisz dac:
  1. SELECT........ ORDER BY XXX DESC LIMIT 8


gdzi XXX to nazwa twojej kolumny z punktami, ktorej sie nie dopatrzylem
londyn123
Nie ma kolumny "punkty", punkty mają być wyliczane z rozegranych meczów w tabeli terminarz.
Już coś powoli mi wychodzi, jak będzie działać - pokaże tutaj kod, moze się komuś przyda.

EDIT:
Mam już działające zapytanie:
  1. SELECT
  2. k.id AS id_klub,
  3. k.nazwa AS nazwa_klub,
  4. SUM(
  5. (@remis := IF (t.bramki_gospodarz = t.bramki_gosc, 1, 0)) +
  6. (@zwyciestwo := IF (
  7. (t.bramki_gospodarz > t.bramki_gosc AND t.id_gospodarz = k.id) OR (t.bramki_gospodarz < t.bramki_gosc AND t.id_gosc = k.id), 1, 0)
  8. ) * 3
  9. ) AS punkty,
  10. SUM(
  11. IF (t.id_gospodarz = k.id OR t.id_gosc = k.id, 1, 0)
  12. ) AS mecze,
  13. SUM(@zwyciestwo) AS wygrane,
  14. SUM(@remis) AS remisy,
  15. SUM(
  16. IF (
  17. (t.bramki_gospodarz < t.bramki_gosc AND t.id_gospodarz = k.id) OR (t.bramki_gospodarz > t.bramki_gosc AND t.id_gosc = k.id),
  18. 1,
  19. 0
  20. )
  21. ) AS przegrane,
  22. SUM(@brz := IF (t.id_gospodarz = k.id, t.bramki_gospodarz, t.bramki_gosc)
  23. ) AS bramki_zdobyte,
  24. SUM(@brs := IF (t.id_gospodarz = k.id, t.bramki_gosc, t.bramki_gospodarz)
  25. ) AS bramki_stracone,
  26. SUM(@brz - @brs) AS roznica_bramek
  27. FROM terminarz
  28. AS t, kluby AS k
  29. WHERE k.id_grupa='".$klub->id_grupa."' AND k.dywizja='".$klub->dywizja."' AND k.liga='".$klub->liga."' AND (t.id_gospodarz = k.id OR t.id_gosc = k.id) AND t.stan='2'
  30. GROUP BY id_klub
  31. ORDER BY punkty DESC, roznica_bramek DESC
spenalzo
Wystarczyłoby dodać dodatkowe pole do tabeli terminarz - kolumne o nazwie np. "wygrany_id", które domyślnie byłoby '0', a jeżeli nie to wtedy id wygranej drużyny... czy coś w tym stylu tongue.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.