Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obrobka zapytania SQL
Forum PHP.pl > Forum > PHP
KR2615
Witam.
Jest ranek a mnie już brakuje świeżych pomysłów. Mam skrypt, którego zadaniem jest pokazywac płatności klientów za dany rok:

  1. <?
  2. $city="55-010";
  3. $rok = date('Y', time());
  4. echo '<table border="1" cellspacing="1" cellpadding="1" rules="all">';
  5. echo '<tr align="center" bgcolor="#555555"><td><b>Imi. i nazwisko</b></td> <td>stycze.</td> <td>luty</td> <td>marzec</td> <td>kwiecie.</td> <td>maj</td> <td>czerwiec</td></tr>';
  6. $query = mysql_query("SELECT * FROM klienci WHERE city='$city' ORDER BY name ASC");
  7. while ($klient = mysql_fetch_array($query)) {
  8. $query2 = mysql_query("SELECT * FROM platnosci WHERE kid='$klient[id]' AND month LIKE '%$rok-%' ORDER BY month ASC");
  9. $m=1;
  10. print('<tr><td>' .$klient[name]. '</td>');
  11. while($row = mysql_fetch_row($query2)) {
  12. if(!empty($row[$m])) { echo '<td bgcolor= "#EBE4D6" align="center">' .wartosc_platnosci($row[5]). ' zl<br />' .date('m.d', strtotime($row[3])). '</td>';
  13. <------> $m++;
  14. <------>} else {
  15. <------> if($m < "10") { $mc="0$m"; } else { $mc=$m; }
  16. <------> echo '<td align="center"><a href="dodaj.php?kid=' .$klient[id]. '&from_form&month=' .$rok. '-' .$mc. '-10">Dodaj platnosc</a></td>'; }
  17. <------> $m++;
  18. <------>}
  19. <------>echo '</tr>';
  20. }
  21. ?>


Działa on tak, że wybiera on wszystkie płatności klienta z dnego roku i przyporządkowuje je kolejnym miesiącom. Np. jeśli znajdzie 4 płatności, wskaże że klient ma opłacone od stycznia do kwietnia. Może się jednak zdażyć, że klient ma dwie usługi i w takim przypadku w tabeli platnosci pojawiaja sie dwa rekordy kazdego miesiaca. Problem jest taki, ze skrypt pokazuje, ze klient ma zaplacone do kwietnia gdy rzezcywiscie sa ta tylko platnosci ze stycznia i lutego, po dwie w kazdym miesiacu. W tabeli platnosci mam zanotowane za jaki miesiac to platnosc. Struktura wyglada tak:

Kod
Kolumna     Typ     Null     Domyślnie     Komentarze     MIME
id     int(11)     Nie                  
kid     int(11)     Nie            ID klienta ktoremu platnosc jest przyporzadkowana      
added     timestamp     Nie      CURRENT_TIMESTAMP            
date     datetime     Nie      0000-00-00 00:00:00      Data wplywu na moje konto     
month     datetime     Nie      0000-00-00 00:00:00      zaksiegowane za miesiac      
value     int(3)     Nie                  
notices     text     Nie


Osobiscie nie mam zadnego innego pomyslu, poza zapytaniem typu SELECT * FROM platnosci WHERE kid='$klient[id]' AND month LIKE '%$rok-$miesiac%' ale w przypadku gdy tabela ma 100 wierszy daje mi to juz 1200 zapytan na strone! Czy ktos ma pomysl jak to inaczej ogarnac? Z gory dzieki i pozdrawiam.
mmmmmmm
Uzyj takiego zapytania:
  1. SELECT k.`id`, k.`name`, Month(p.`month`)miesiac, Sum(p.`value`) razem FROM klienci k JOIN platnosci p ON k.id=p.kid WHERE k.city=$city GROUP BY 1,2,3 ORDER BY 1, 3
KR2615
Zapytanie daje poprawną odpowiedź ale ie jest to to, o co mi chodzi. W rezultacie chciałbym dostać id, kwotę, nazwę płatności które klient wpłacił danego miesiaca a nie sumę kwoty jaka wpłyneła na konto. Inaczej chodzi o to, żeby było wyraźnie widac że klient płaci za kilka usług lub puszcza parę przelewów danego miesiaca.

Edit: Oto przykładowe zapytanie do bazy i rezultat żeby było jasniej:

  1. Zapytanie SQL: SELECT * FROM platnosci WHERE customerid='1234' AND month LIKE '%2012-%' ORDER BY month ASC LIMIT 0, 100 ;
  2. Rekordów: 9
  3. id customerid added date (DATA wplywu na konto) month (zaksiegowane za miesiac) value notices
  4. 22214 1234 2012-03-07 10:00:03 2012-02-27 00:00:00 2012-01-10 00:00:00 39.99
  5. 22742 1234 2012-04-03 15:03:14 2012-03-26 00:00:00 2012-02-10 00:00:00 39.99
  6. 22743 1234 2012-04-03 15:03:24 2012-03-26 00:00:00 2012-03-10 00:00:00 19.99
  7. 23798 1234 2012-05-09 14:22:58 2012-04-25 00:00:00 2012-03-10 00:00:00 39.99
  8. 23799 1234 2012-05-09 14:23:09 2012-04-25 00:00:00 2012-04-10 00:00:00 19.99
  9. 25305 1234 2012-06-28 09:43:27 2012-05-25 00:00:00 2012-04-10 00:00:00 39.99
  10. 24465 1234 2012-06-04 16:29:56 2012-05-25 00:00:00 2012-05-10 00:00:00 19.99
  11. 25306 1234 2012-06-28 09:44:52 2012-06-25 00:00:00 2012-05-10 00:00:00 39.99
  12. 25304 1234 2012-06-28 09:37:12 2012-06-25 00:00:00 2012-06-10 00:00:00 19.99
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.