Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ranking według czasów i ex aequo
Forum PHP.pl > Forum > Bazy danych > MySQL
p_a_wik
Witam

Mam problem z wyświetleniem wyników z bazy w przypadku "ex aequo"
Tabela 'wyniki' wygląda jak poniżej:

Kod
id     impreza     zawodnik     czas
73    1    18    00:40:09
72    1    19    00:40:27
79    1    25    00:40:31
74    1    21    00:40:37
80    1    27    00:40:38
78    1    26    00:40:39
77    1    23    00:40:44
71    1    17    00:40:47
76    1    24    00:40:53
67    1    14    00:41:05
75    1    20    00:41:05
68    1    13    00:41:17
69    1    16    00:41:38
70    1    15    00:41:03
55    1    2    00:41:48
56    1    1    00:41:50
65    1    12    00:42:10
66    1    11    00:42:10
57    1    4    00:42:42
63    1    10    00:43:17
64    1    9    00:43:29
61    1    8    00:44:15
62    1    7    00:44:26
59    1    6    00:45:17
60    1    5    00:45:34


Zapytanie do bazy

  1. SELECT * , FIND_IN_SET( czas, (
  2. SELECT GROUP_CONCAT( DISTINCT czas
  3. ORDER BY czas ASC )
  4. FROM wyniki )
  5. ) AS rank
  6. FROM wyniki
  7. WHERE impreza = 1
  8. ORDER BY `rank` ASC


Wynik zapytania

Kod
id     impreza     zawodnik     czas     rank
73    1    18    00:40:09    1
72    1    19    00:40:27    2
79    1    25    00:40:31    3
74    1    21    00:40:37    4
80    1    27    00:40:38    5
78    1    26    00:40:39    6
77    1    23    00:40:44    7
71    1    17    00:40:47    8
76    1    24    00:40:53    9
67    1    14    00:41:05    10
75    1    20    00:41:05    10
68    1    13    00:41:17    11
69    1    16    00:41:38    12
70    1    15    00:41:03    13
55    1    2    00:41:48    14
56    1    1    00:41:50    15
65    1    12    00:42:10    16
66    1    11    00:42:10    16
57    1    4    00:42:42    17
63    1    10    00:43:17    18
64    1    9    00:43:29    19
61    1    8    00:44:15    20
62    1    7    00:44:26    21
59    1    6    00:45:17    22
60    1    5    00:45:34    23


Ja zrobić żeby po drugiej 10 rank równy był 12 questionmark.gif
Wtedy kolejne ex aequo będzie na 17 pozycji a w rezultacie rozdzielone będzie 25 miejsc a nie 23
Pętla do wyświetlenia wyników

  1. while ($row = mysql_fetch_array($result, MYSQL_NUM))
  2. {
  3.  
  4. $id_result = $row[0];
  5. $z_numer_startowy= $row[2]+0;
  6. $w_czas = $row[3];
  7. $rank = $row[4];
  8. }


Z góry dziękuje za podpowiedzi
sazian
najłatwiej będzie zrobić order by czas a w php
przed pętlą $rank=0;
w pętli $rank++;
p_a_wik
ale o ile dobrze rozumiem jak dam $rank++;
i pętle to nie będzie ex aequo tylko będzie 10, 11 przy tych samych czasach
a nie o to tutaj chodzi
SmokAnalog
Ja to robię np. tak (zakładam, że pole z czasem nazywa się "czas"):
  1. $previousTime = false;
  2. for ($rank = 1; $row = mysql_fetch_assoc($result); $rank++) { // zamiast przypisywać do zmiennych wg indeksów, lepiej użyć mysql_fetch_assoc
  3. if($row['czas'] !== $previousTime) {
  4. $displayRank = $rank;
  5. }
  6.  
  7. // wypisujesz co chcesz :) dostęp do wartości z bazy masz w $row['nazwa_pola']
  8. // kolejność zawodnika masz w zmiennej $displayRank
  9.  
  10. $previousTime = $row['czas'];
  11. }
sazian
to dodaj sobie jeszcze $lastTime =null;
a w pętli
if($lastTime!=$row[2])
{
$rank++;
}
$lastTime=$row[2];
SmokAnalog
Cytat(sazian @ 27.11.2013, 22:32:40 ) *
to dodaj sobie jeszcze $lastTime =null;
a w pętli
if($lastTime!=$row[2])
{
$rank++;
}
$lastTime=$row[2];

To też nie będzie dobrze, bo wyniki sportowe liczy się tak:
Kod
1) 2:14
2) 2:16
2) 2:16
4) 2:21
5) 2:22

A Ty proponujesz takie coś:
Kod
1) 2:14
2) 2:16
2) 2:16
3) 2:21
4) 2:22
phpion
Musisz mieć 2 zmienne sterujące: $x do zliczania pozycji (zawsze inkrementujesz) oraz $y do wyświetlania pozycji (zwiększasz gdy aktualny wynik jest inny od poprzedniego). Musisz również w którymś momencie/sytuacji przypisać $y = $x. Kombinuj 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.