Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Group by i policzenie rekordów
Forum PHP.pl > Forum > Bazy danych
sadu
Mam tabele wpisy z polami

Wpisy:
id
nazwa
utworzone

I tam sie dodaja jakies wpisy raz na jakis czas. Teraz musze policzyc wedlug dat wszystkie wpisy dodane miedzy datami A i B... gdy nie ma wpisow pokazac 0.

Wiem ze trzeba zrobic count(id) i group by wedlug "utworzone" ale gdy w danym dniu nie dodano rekordu sql nie zwroci 0 w danym dniu po prostu oleje ten dzien...

Musze to programistycznie zalatwic czy moze ktos zna jakis madry sposob ?

Z goru dzieki za pomoc.
sf
Ja bym to zrobił tak. Utworzyłbym tabelę tymczasową, która zawierałaby wygenerowane dni z przedziału A do B, zrobił złączenie z tabelą zawierającą dane i już wtedy masz możliwość wyliczenia pozycji gdzie nie było danego dnia winksmiley.jpg
proffix
A może starczy wykorzystać po prostu :

1. klauzulę BETWEEN

lub

  1. SELECT count(id) AS ile FROM tabela WHERE day(utworzone) > day(data_pierwsza) AND day(utworzone) < day(data_druga) AND month(utworzone) > month(data_pierwsza) AND month(utworzone) < month(data_druga) AND year(utworzone) > year(data_pierwsza) AND year(utworzone) < year(data_druga)
sf
@proffix: a może jednak nie, przecież jest napisane, że ma wyświetlać daty, których nie ma zapisanych w tabeli z danymi
k@zio
Podepnę się, mam podobne zadanie z datami.
Chciałbym zrobić count(*) wg miesięcy, tak aby orzymać mniej więcej:
miesiac - count (*)
styczeń - 34
luty - 46
....
JaRoPHP
  1. SELECT miesiac, count(miesiac)
  2. FROM tabela GROUP BY miesiac
k@zio
No tak bardzo mądrze napisałem smile.gif
Nie dodałem tylko , że mam pole "data_operacji" w postaci "18.07.2007" a nie w postaci "styczeń, luty..."
JaRoPHP
Cytat(k@zio @ 18.07.2007, 18:23:13 ) *
Nie dodałem tylko , że mam pole "data_operacji" w postaci "18.07.2007" a nie w postaci "styczeń, luty..."
To zmienia postać rzeczy smile.gif.

Poniższe zapytanie musisz troszkę zmodyfikować (np. dodać brakujące miesiące smile.gif):
  1. SELECT
  2. CASE
  3. WHEN substr(data_operacji,4,2) = '01' THEN 'styczeń'
  4. WHEN substr(data_operacji,4,2) = '02' THEN 'luty'
  5. END AS miesiac,
  6. COUNT(substr(data_operacji,4,2)) AS ilosc
  7. FROM tabela GROUP BY substr(data_operacji,4,2)
k@zio
Dzięki wielkie.
proffix
Cytat(sf @ 17.07.2007, 14:09:01 ) *
@proffix: a może jednak nie, przecież jest napisane, że ma wyświetlać daty, których nie ma zapisanych w tabeli z danymi


No to ja nie wiem co to znaczy : "Teraz musze policzyc wedlug dat wszystkie wpisy dodane miedzy datami A i B... gdy nie ma wpisow pokazac 0"

Chodzi chyba o ilość rekordów między datami a nie te daty gdzie nie ma rekordów smile.gif

Już się zamotałem tongue.gif
sadu
Cytat(JaRoPHP @ 18.07.2007, 18:01:08 ) *
To zmienia postać rzeczy smile.gif.

Poniższe zapytanie musisz troszkę zmodyfikować (np. dodać brakujące miesiące smile.gif):
  1. SELECT
  2. CASE
  3. WHEN substr(data_operacji,4,2) = '01' THEN 'styczeń'
  4. WHEN substr(data_operacji,4,2) = '02' THEN 'luty'
  5. END AS miesiac,
  6. COUNT(substr(data_operacji,4,2)) AS ilosc
  7. FROM tabela GROUP BY substr(data_operacji,4,2)



Jak dla mnie malo czytelne... robic case dla kazdego miesiaca ?

Lepiej uzyc funkcji DATE_FORMAT np:

DATE_FORMAT(`filled_at`, '%m')

pozniej array("1" => "styczen",...) i jazda z tematem

Z tym ze jak wdanym miesiacu nie ma wpisu to nie zwroci Ci 0 ehhh
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.