Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mysql] Group by i policzenie rekordów, Jak policzyc rekordy wedlug daty
sadu
post 17.07.2007, 10:26:17
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 25.04.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
sf
post 17.07.2007, 11:06:23
Post #2





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

Ostrzeżenie: (0%)
-----


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


--------------------
Zapraszam na mój php blog, tworzenie stron.
Go to the top of the page
+Quote Post
proffix
post 17.07.2007, 12:43:58
Post #3





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 16.07.2007

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
sf
post 17.07.2007, 13:09:01
Post #4





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

Ostrzeżenie: (0%)
-----


@proffix: a może jednak nie, przecież jest napisane, że ma wyświetlać daty, których nie ma zapisanych w tabeli z danymi


--------------------
Zapraszam na mój php blog, tworzenie stron.
Go to the top of the page
+Quote Post
k@zio
post 18.07.2007, 15:49:18
Post #5





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 27.02.2007

Ostrzeżenie: (0%)
-----


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
....
Go to the top of the page
+Quote Post
JaRoPHP
post 18.07.2007, 18:10:58
Post #6





Grupa: Zarejestrowani
Postów: 675
Pomógł: 15
Dołączył: 7.11.2004
Skąd: Katowice

Ostrzeżenie: (0%)
-----


  1. SELECT miesiac, count(miesiac)
  2. FROM tabela GROUP BY miesiac


--------------------
Kto pyta, nie błądzi...
Kto zbłądził, ten pyta...
Go to the top of the page
+Quote Post
k@zio
post 18.07.2007, 18:23:13
Post #7





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 27.02.2007

Ostrzeżenie: (0%)
-----


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..."
Go to the top of the page
+Quote Post
JaRoPHP
post 18.07.2007, 19:01:08
Post #8





Grupa: Zarejestrowani
Postów: 675
Pomógł: 15
Dołączył: 7.11.2004
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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)


--------------------
Kto pyta, nie błądzi...
Kto zbłądził, ten pyta...
Go to the top of the page
+Quote Post
k@zio
post 18.07.2007, 19:09:49
Post #9





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 27.02.2007

Ostrzeżenie: (0%)
-----


Dzięki wielkie.
Go to the top of the page
+Quote Post
proffix
post 19.07.2007, 09:35:03
Post #10





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 16.07.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
sadu
post 19.07.2007, 14:49:40
Post #11





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 25.04.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 19:10