Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Indeksowanie albo uporządkowanie wyników zapytania
Forum PHP.pl > Forum > Przedszkole
ichu
Tworzę aplikację, która pozwala m.in. obliczyć średnie spalanie paliwa między kolejnymi tankowaniami. Po krótce wygląda to tak, że dla każdego pojazdu w firmie codziennie wystawiana jest karta pracy, gdzie są odnotowywane różne dane dotyczące czasu, miejsca pracy itd, w tym również tankowania. Przy każdym tankowaniu odnotowywana jest ilość pobranego paliwa (tankowanie zawsze do pełna), stan licznika przy tankowaniu. Dzięki temu można wyliczyć średnie spalanie. Problem tylko w tym, że tankowanie nie odbywa się codziennie, i przy pobieraniu rekordów z bazy otrzymuję dziwne wyniki, nie pozwalające na uzyskanie właściwego wyniku.

  1. function pozycje_raportu($sprzetID,$ddataOD,$ddataDO)
  2. {
  3. $query="SELECT * FROM karty_drogowe
  4. LEFT JOIN kierowcy ON karty_drogowe.kierowcaID = kierowcy.kierowcaID
  5. WHERE karty_drogowe.sprzetID=$sprzetID
  6. AND karty_drogowe.kartaData BETWEEN '$ddataOD' AND '$ddataDO'
  7. ORDER BY kartaData ASC";
  8. $result=mysql_query($query);
  9. $num=mysql_numrows($result);
  10.  
  11. if(empty($num))
  12. {
  13. echo '<tr><td colspan="6">Brak szczegółowych pozycji w danym okresie</td></tr>';
  14. }
  15. else
  16. {
  17. echo '<tr><td>Data</td><td>Kierowca</td><td>Paliwo zatankowane</td><td>Stan licznika</td><td>Średnie spalanie</td><td>Ilość km</td></tr>';
  18. $i=0;
  19. while ($i<$num)
  20. {
  21. $sprzetID=mysql_result($result,$i,"sprzetID");
  22. $paliwoStan=mysql_result($result,$i,"paliwoStan");
  23. $tankLicznik=mysql_result($result,$i,"tankLicznik");
  24. if($i==0)
  25. { }
  26. else
  27. {
  28. $minusjeden=mysql_result($result,$i-1,"tankLicznik");
  29. }
  30. $kartaData=mysql_result($result,$i,"kartaData");
  31. $imie=mysql_result($result,$i,"imie");
  32. $nazwisko=mysql_result($result,$i,"nazwisko");
  33. $kierowca=$imie.' '.$nazwisko;
  34. $tankLicznik=mysql_result($result,$i,"tankLicznik");
  35. $przebieg=$tankLicznik-$minusjeden;
  36.  
  37. if($minusjeden==0)
  38. { }
  39. else
  40. {
  41. $srednie=round(($paliwoStan*100)/$przebieg, 2);
  42. }
  43.  
  44. if(empty($paliwoStan)&&empty($tankLicznik))
  45. { }
  46. else
  47. {
  48. echo '<tr><td>'.$kartaData.'</td><td>'.$kierowca.'</td><td>'.$paliwoStan.'</td><td>'.$tankLicznik.'</td> <td>'.$srednie.' (i:'.$i.')</td><td>'.$przebieg.'</td></tr>';
  49. }
  50. $i++;
  51. }}}

Otrzymuję taki wynik (celowo dałem zwracanie $i obok średniej aby pokazać w czym tkwi mój problem):

W przypadku innych pojazdów kolejne wartości $i wyglądają nawet tak: 3, 7, 15, 25...
Pytanie: jak zrobić, by $i szło po kolei (tj. 1, 2, 3, 4...) aby móc dokonywać obliczeń w oparciu o poprzedni rekord?
aeaeae
  1. function pozycje_raportu($sprzetID,$ddataOD,$ddataDO)
  2. {
  3. $query="SELECT * FROM karty_drogowe
  4. LEFT JOIN kierowcy ON karty_drogowe.kierowcaID = kierowcy.kierowcaID
  5. WHERE karty_drogowe.sprzetID=$sprzetID
  6. AND karty_drogowe.kartaData BETWEEN '$ddataOD' AND '$ddataDO'
  7. ORDER BY kartaData ASC";
  8. $result=mysql_query($query);
  9. $num=mysql_numrows($result);
  10.  
  11. if(empty($num))
  12. {
  13. echo '<tr><td colspan="6">Brak szczegółowych pozycji w danym okresie</td></tr>';
  14. }
  15. else
  16. {
  17. echo '<tr><td>Data</td><td>Kierowca</td><td>Paliwo zatankowane</td><td>Stan licznika</td><td>Średnie spalanie</td><td>Ilość km</td></tr>';
  18. $i=0;
  19. $i2=0;
  20. while ($i<$num)
  21. {
  22. $sprzetID=mysql_result($result,$i,"sprzetID");
  23. $paliwoStan=mysql_result($result,$i,"paliwoStan");
  24. $tankLicznik=mysql_result($result,$i,"tankLicznik");
  25. if($i==0)
  26. { }
  27. else
  28. {
  29. $minusjeden=mysql_result($result,$i-1,"tankLicznik");
  30. }
  31. $kartaData=mysql_result($result,$i,"kartaData");
  32. $imie=mysql_result($result,$i,"imie");
  33. $nazwisko=mysql_result($result,$i,"nazwisko");
  34. $kierowca=$imie.' '.$nazwisko;
  35. $tankLicznik=mysql_result($result,$i,"tankLicznik");
  36. $przebieg=$tankLicznik-$minusjeden;
  37.  
  38. if($minusjeden==0)
  39. { }
  40. else
  41. {
  42. $srednie=round(($paliwoStan*100)/$przebieg, 2);
  43. }
  44.  
  45. if(empty($paliwoStan)&&empty($tankLicznik))
  46. { }
  47. else
  48. {
  49. echo '<tr><td>'.$kartaData.'</td><td>'.$kierowca.'</td><td>'.$paliwoStan.'</td><td>'.$tankLicznik.'</td> <td>'.$srednie.' (i:'.$i2.')</td><td>'.$przebieg.'</td></tr>';
  50. $i2++;
  51. }
  52. $i++;
  53. }}}
  54.  
ichu
Dzięki, ale niezupełnie oto mi chodziło. Długo nad tym myślałem, aż zamieściłem kod tutaj, i nagle mnie olśniło:
  1. SELECT * FROM karty_drogowe
  2. LEFT JOIN kierowcy ON karty_drogowe.kierowcaID = kierowcy.kierowcaID
  3. WHERE karty_drogowe.sprzetID=$sprzetID
  4. AND paliwoStan>'0'
  5. AND karty_drogowe.kartaData BETWEEN '$ddataOD' AND '$ddataDO'
  6. ORDER BY kartaData ASC

Pobieram tylko rekordy, gdzie odnotowano zatankowanie pojazdu i wtedy rekordy mają indeksy po kolei, zaczynając od 0.
Przepraszam za zamieszanie.
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.