Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Grupowanie wyników i generowanie tabelki
Forum PHP.pl > Forum > Przedszkole
konsument
Witajcie, mam problem z skryptem, który będzie generował tabelkę. Pakuję do jednej tabelki dane dotyczące pracowników (ilość przepracowanych godzin danego dnia, data, id_zadania, id_klienta, id_pracownika). Struktura:

  1. CREATE TABLE IF NOT EXISTS `wh_zadanie_czaspracy` (
  2. `id_czaspracy` int(11) NOT NULL AUTO_INCREMENT,
  3. `id_zadanie` int(11) NOT NULL,
  4. `id_pracownik` int(11) NOT NULL,
  5. `id_klient` int(11) NOT NULL,
  6. `date` date NOT NULL,
  7. `czas` int(11) NOT NULL,
  8. PRIMARY KEY (`id_czaspracy`)
  9. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;
  10.  
  11. INSERT INTO `wh_zadanie_czaspracy` (`id_czaspracy`, `id_zadanie`, `id_pracownik`, `id_klient`, `date`, `czas`) VALUES
  12. (12, 1, 3, 1, '2013-01-18', 8),
  13. (11, 2, 3, 2, '2013-01-18', 8),
  14. (9, 2, 3, 2, '2013-01-16', 5),
  15. (7, 2, 3, 2, '2013-01-15', 6),
  16. (10, 2, 3, 2, '2013-01-13', 6),
  17. (13, 1, 3, 1, '2013-01-16', 6),


A tutaj generuję tabelkę
  1. echo '<table style="width: 300px; clear:both;" class="list">';
  2. echo '<tr class="bold">';
  3. echo '<td style="width:100px;">Data</td>';
  4.  
  5. // TUTAJ GENERUJĘ NAGŁÓWKI TABELKI Z NAZWAMI ZADAŃ
  6. $zapytanie0 = "SELECT * FROM ".$prefix."zadanie_czaspracy cp INNER JOIN ".$prefix."zadanie z ON cp.id_zadanie = z.id WHERE `id_pracownik`= ".$id_pracownik." GROUP BY cp.id_zadanie HAVING count(*) > 1 ";
  7. $news0 = mysql_query($zapytanie0) or die ('Błąd: ' . mysql_error());
  8. while ($rekord0 = mysql_fetch_assoc($news0)) {
  9. echo '<td>'.$rekord0[nazwa].'</td>';
  10. }
  11. echo "</tr>";
  12.  
  13. // A TUTAJ WYŚWIETLAM WERSY Z DATĄ I ILOŚCIĄ GODZIN PRZEPRACOWANĄ (W ZALEŻNOŚCI OD ZADANIA)
  14. $zapytanie = "SELECT date, czas, id_czaspracy, id_zadanie FROM ".$prefix."zadanie_czaspracy WHERE id_pracownik = ".$id_pracownik." order by date ASC";
  15. $news1 = mysql_query($zapytanie) or die ('błąd: ' . mysql_error());
  16. $daty = array();
  17. while ($row = mysql_fetch_array($news1)) {
  18. $id_date = $row['date'];
  19. if (!isset($daty[$id_date]))
  20. $daty[$id_date] = array('date' => $row['date'], 'czas' => array());
  21.  
  22. if (!empty($row['czas']))
  23. $daty[$id_date]['czas'][] = array('czas' => $row['czas']);
  24. }
  25.  
  26. // WYŚWIETLANIE GODZIN I DATY
  27. foreach ($daty as $id => $data){
  28. echo '<tr><td>'.$data['date'].' </td>';
  29. foreach ($data['czas'] as $czaspracy){
  30. echo '<td>'.$czaspracy['czas'].'</td>';
  31. }
  32. echo '</tr>';
  33. }
  34. echo '</table>';
  35. echo '<pre>';
  36. print_r($daty);
  37. echo '</pre>';
  38. ?>


Rezultatem jest tabela z pustymi wersami, zamiast dziur chciałbym, żeby były powstawiane zera.

  1. DATA Zadanie1 Zadanie2
  2. 2013-01-13 6
  3. 2013-01-15 6
  4. 2013-01-16 5 6
  5. 2013-01-18 8 8


Chciałbym, aby ilość godzin była przypisana do odpowiedniej kolumny (zadania), a tam gdzie pracownik nie pracował, żeby się pojawiło zero. Nie mam pomysłu jak prawidłowo wygenrować taką tabelkę. Chciałbym aby wyglądała
  1. DATA Zadanie1 Zadanie2
  2. 2013-01-01 6 0
  3. 2013-01-02 6 6
  4. 2013-01-03 0 6


Z góry dzięki za wszelkie sugestie.
b4rt3kk
Najprostszym rozwiązaniem będzie oczywiście w momencie wyświetlania wyników sprawdzenie czy dana komórka jest pusta i w takiej sytuacji wyświetlenie 0.

  1. if ($rekord[kolumna] == '') echo '0'; else echo $rekord[kolumna];


Jeśli chcesz to zrealizować jeszcze w zapytaniu to użyj:

  1. ISNULL(count(*), 0)
konsument
Dzięki za sugestie, ale niestety nie do końca o to mi chodziło albo nie umiem tego poprawnie zrobić.

  1. if ($rekord[kolumna] == '') echo '0'; else echo $rekord[kolumna];

nie dojdzie do sprawdzenia $rekord[czas] bo fizycznie tego w bazie danych nie ma. Musiałbym przrobić system i domyślnie przy dodawaniu zadania pakować do bazy dla każdego pracownika wpisy w stylu [id_pracownika, id_zlecenia, 2013-01-01, 0 (ilość godzin)] na cały miesiąc. A później update po przypisaniu ilości godzin.

U mnie w bazie jak pracownik danego dnia nie był w pracy to nie ma o tym żadnego wpisu. A inny problem to przypisanie ilość godzin danego dnia do odpowiedniej kolumny (zadania).
Docelowo chciałbym stworzyć taką oto tabelkę:
  1. DATA Zadanie1 Zadanie2 Zadanie 3
  2. 2013-01-01 6 0 2
  3. 2013-01-02 4 2 0
  4. 2013-01-03 0 8 0


Tylko tam gdzie mam zera to nie mam żadnych wpisów w bazie. Liczba zadań może być różna dla danego pracownika.


////// DOPISEK
Generalnie problem polega na tym, aby do tablicy wstawić w odpowiedniej kolejności czas pracy i zera jeśli danego dnia pracownik nie pracował.

Obecnie udało mi się osiąganąć taką oto tabelkę:
http://i.stack.imgur.com/iqDFC.png

Oto moje dane w tablicy:
http://s3.amazonaws.com/awesome_screenshot...CNNN0bACkdI4%3D

A może należy ten problem ugryżć zupełnie inaczej? Jakieś idee?
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.