Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]rowspan = ilość rekordów z tą samą datą
Forum PHP.pl > Forum > Przedszkole
fruzin
Witam
Jako nowy użytkownik tego forum mam pytanie:
Mam bazę zawierającą kolumny (ID), DATA, ZMIANA, OPERATOR, WYROB, ILOSC, itp.
Załóżmy że wyświetlę jakąś część tej bazy (ostatni tydzień), sortując najpierw po dacie a później po zmianie, w postaci prostej tabeli.
W bazie jest kilka rekordów z tą samą datą i/lub datą i zmianą i chciałbym połączyć sąsiadujące komórki z tą samą datą za pomocą ROWSPAN (wyłącznie dla celów estetycznych).
Teraz pytanie jak to zrobić?
Myślałem o zadaniu kilku zapytań dla kolejnych dat (więc będą i te wolne od pracy a to wymusza dodatkową pętlę warunkową) i wyciągnąć z każdego zapytania ilość wierszy MYSQL_NUM_ROWS, ale co będzie jak będę chciał wyświetlić np. cały rok - 365 zapytań do sql?
A może jest jakiś sposób który zliczy z RAZ pobranej tabeli ilość rekordów o tej samej dacie i wstawi się ją do rowspan - na to nie mam jeszcze pomysłu.
Podsumowując
z czegoś takiego:
  1. <tr><td>2010-10-26</td><td>1</td><td>x</td></tr>
  2. <tr><td>2010-10-26</td><td>2</td><td>y</td></tr>
  3. <tr><td>2010-10-26</td><td>3</td><td>z</td></tr>
  4. <tr><td>2010-10-27</td><td>1</td><td>a</td></tr>
  5. <tr><td>2010-10-27</td><td>2</td><td>b</td></tr>
  6. <tr><td>2010-10-27</td><td>3</td><td>c</td></tr>
  7. <tr><td>2010-10-27</td><td>3</td><td>d</td></tr>

chciałbym uzyskać to:
  1. <tr><td rowspan="3">2010-10-26</td><td>1</td><td>x</td></tr>
  2. <tr><td>2</td><td>y</td></tr>
  3. <tr></td><td>3</td><td>z</td></tr>
  4. <tr><td rowspan="4">2010-10-27</td><td>1</td><td>a</td></tr>
  5. <tr><td>2</td><td>b</td></tr>
  6. <tr><td rowspan="2">3</td><td>c</td></tr>
  7. <tr><td>d</td></tr>

Pozdrawiam
konrados
Nie jestem pewien czy dobrze Cię zrozumiałem, jeśli tak, to możesz po prostu zrobić mały if w php:
  1. $prevDateTime = "";
  2. foreach... (tu pętla czytająca rekordy)
  3. {
  4. $curDateTime = $sqlData['DATA'];
  5. if($curDateTime == $prevDateTime){
  6. //łączymy komórki, data ta sama
  7. }else{
  8. //data jest inna
  9. }
  10. //...
  11. $prevDateTime = $curDateTime;
  12. }
fruzin
Wydaje mi się, że twoja koncepcja jest dobra i z związku z nią nasunął mi się taki pomysł:
1. odczyt rekordów powinien odbywać się od d... strony (SORT BY ... DESC) bo dopiero wówczas przy ostatniej pętli gdzie prevDate=curDate wiadomo ile jest rekordów z tą samą datą i można wówczas nadać $rowspan jakąś wartość.
2. wyświetlić w/w tabelę ponownie wspak z pominięciem rekordu DATA tyle razy ile wynosi $rowspan.
ALBO
ponownie przelecieć $query wyłącznie pod kątem ilości rekordów o tych samych datach i stworzyć z tego tablicę (nawet jednowymiarową) i powiązać ją z tabelą wynikową z sql.

I'm still working on it!
thek
Jeśli już masz zamiar kombinować, to może zamiast klejenia tego w locie, zapisz najpierw w odpowiedniej strukturze, która potem łatwo ogarnąć. O co mi biega? Ano zamiast tworzyć ową tabelę na żywca - mieszając PHP z HTML (odseparuj widok od modelu i kontrolera!) - obrób wpierw dane do zjadliwej formy. Z tego co widzę, to masz nawet zagłębienia, więc pomyśl choćby o zagnieżdżonych tablicach. Może z danego zestawu rekordów bazy danych utwórz coś w stylu:
  1. $dane = array (
  2. '2010-10-26' => array( '1' => 'x', '2' => 'y', '3' => 'z' ),
  3. '2010-10-27' => array( '1' => 'a', '2' => 'b', '3' => array( 'c', 'd' ) )
  4. );
i na podstawie tego potem zliczaj. Oczywiście to tylko kierunek w jakim powinieneś myśleć, bo ów przykład ma pewną niedogodność wynikającą z zagnieżdżenia struktury. Popatrz a pewnie sam zauważysz. Ale to już zadanie domowe jak ominąć ów problem winksmiley.jpg
fruzin
Nie mam za wiele czasu aby poświęcić się mojemu problemowi bez reszty, ale co mi się pomyślało przed chwilą (po przeczytaniu pewnych manuali itp.)
Mam dwa zapytania do SQL:
  1. SELECT * FROM `PRODUKCJA`

oraz
  1. SELECT `data`, count(`data`) AS `rowspan` FROM `produkcja` GROUP BY `data`

Teraz albo mogę z tego stworzyć (tu liczę na waszą pomoc) jedno zapytanie z podzapytaniem tak aby np. na końcu wyniku była kolumna `rowspan` z ilością rekordów o takiej samej dacie. Albo może uważacie że informacje z drugiego zapytania wykorzystać do utworzenia instrukcji warunkowej, która to już zajmie się łączeniem wierszy.
Próbowałem tak:
  1. SELECT *, (SELECT COUNT(`data`) FROM `produkcja`) AS `rowspan` FROM `produkcja` ORDER BY `data` ASC

to dodało mi na końcu tabeli kolumnę z ilością wszystkich rekordów - o coś takiego mi chodzi, ale w ostatniej kolumnie chcę mieć podaną ilość rekordów z datą taka jak data danego rekordu a nie liczbę wszystkich rekordów. Zadanie jest trudne bo podzapytanie musi zwrócić jeden wiersz. Więc kombinuję dalej tak:
  1. SELECT *, (SELECT COUNT(`data`) FROM `produkcja` WHERE `data`='2010-10-28') AS `rowspan` FROM `produkcja` ORDER BY `data` ASC

Fajnie tylko, że teraz mam w ostatniej kolumnie same 4 (tyle mam rekordów z datą 28-10).

Czy możliwe jest uzyskanie z podzapytania liczby rekordów z datą jak data rekordu?
POMÓŻCIE

No i mam solution!

  1. SELECT DATA, zmiana, id_operator, wyrob, cykle, p.row FROM produkcja
  2. LEFT JOIN (SELECT DATA, COUNT(DATA) AS row FROM produkcja GROUP BY DATA) AS p
  3. USING(DATA)
  4. ORDER BY DATA ASC, zmiana ASC

Macie jakieś pomysł optymalizacji w/w skryptu?
Nie wiem tylko dlaczego jak podam SELECT * do dostaję na końcu dwie kolumny `row` - stąd musiałem wymienić niezbędne kolumny w zapytaniu.
Teraz tylko skrypt w PHP, który odpowiednio zinterpretuje kolumnę `row` i będą bardzo kontent.

Kolejnym krokiem będzie rowspan zależny od liczby rekordów w tą samą datą i zmianą, ale ten problem odkładam na później. Oczywiście jak go rozwiążę to podzielę się tą radosną nowiną.
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.