klag
11.09.2003, 11:31:29
Mam takie oto pytanie - potrzebuje wyłowić z tabeli rekordy posiadające tę samą date i je policzyć np. w obrębie ostatnich 30 dni.
Zatem formuła powinna być mniej więcej taka:
[php:1:9f27dd56d0]
<?php
for($i=30;$i>1;$i--)
{
$zapytanie = "select * from statystyki WHERE stat_data>'".$data."'-'".$i."'";
$wynik = mysql_query($zapytanie);
if (!$wynik)
{
echo "AAAAAAAAAAA!!!!!!";
}
$ile_znalezionych=mysql_num_rows($wynik);
}
?>[/php:1:9f27dd56d0]
Dlaczego zapytanie typu:
[sql:1:9f27dd56d0]
select * from statystyki WHERE stat_data>JakasData-30
[/sql:1:9f27dd56d0]
nie działa poprawnie.
Dzięki za odpowiedź.
spenalzo
11.09.2003, 11:33:09
Podpowiem, że najlepiej liczyć tak:
[php:1:ec8b8d1e7e]<?php
$q=mysql_query("SELECT count(ID) FROM tabela WHERE warunki");
$ille=mysql_result($q,0);
?>[/php:1:ec8b8d1e7e]
klag
11.09.2003, 11:34:38
i naturalnie data typu:
[php:1:821025f56f]<?php
$data=date("Y-m-d");
?>[/php:1:821025f56f]
klag
11.09.2003, 11:40:04
To co podałeś to tylko inny sposób zapytania - a ten jest celowy bo i tak będą rekordy później wyświetlane.
A chodzi tylko o to jak kostruować pętle tak aby daty były data-1, data-2 i zliczać od daty bazowej liczbę wejść przez np. kolene 30 dni.
spenalzo
11.09.2003, 11:46:40
Lepiej jakbyś zapisywał datę w formacie uniksowym, łatwiej formatować, sortować itd.
klag
11.09.2003, 11:53:58
Tylko mająć w bazie 2000 rekordów to lekko za późno - musze sie z tym uporać tak jak jest 8O . Człowiek głupi nie pomyślał wcześniej.
DeyV
11.09.2003, 12:09:30
ale przecież jednorazowe przeliczenie 2000 rekordów to nie jest taki duży problem - [manual:ba4e826eda]mktime [/manual:ba4e826eda]sobie z tym dobrzre poradzi
klag
11.09.2003, 12:15:34
Tyle że przeliczanie to zawracanie kijem wisły bo tu tak naprawde chodzi o to czy sql potrafi wygenerować datę o jeden dzień późniejszą/wcześniejszą od znanej. Np. 2003-09-11 (2003-09-10 lub 2003-09-12) na zasadzie data+1 (coś na zasadzie przeciążonych operatorw). I tu w php probelemu nie ma bo zawsze można napisać taki operator(funkcje) która wygeneruje te daty biorąc pod uwagę rok przestępny, ilość dni w miesciącu itd.
Mnie tylko zastanwia dlaczego sql nie potrafi - albo potrafi a ja tego nie umiem zrobić - tak prostej rzeczy jak where stat_data=data-1. Bo gdyby to działało to po zbiciu w pętli problem znika sam.
DeyV
11.09.2003, 12:22:13
Ale zaraz, nie tak szybko.
Najpierw robisz pewne rzeczy po swojemu, rezygnując z możłiwości bazy (czyli zamiast opierać sie na polu przeznaczony konkretnie na date (timestamp) lub - już trochę mniej na to, czyli Int) Ty wolisz zapisywać datę jak string. Twoje prawo, ale w tensposób na pewno sobie nie pomagasz. Co wiecej - w php tez nie możesz napisać po prostu '3-10-2003' +1 o oczekiwać kolejnego dnia.
Czemu wiec wymagać tego od MySQL?
klag
11.09.2003, 12:54:21
Jest wręcz dowrotnie.
1. POle o którym mowa stat_data jest typu date wobec czego silnie związane z polem daty MySql'a - tylko data pokazana przeze mnie jako RRRR-MM-DD jest chyba oczywista - tak musi wyglądać ta data i taka jest do tabeli dopisywana.
2. Ja oczekuje tylko i wyłącznie tego że MySql ma swój przeciążony operator inc.dec dat - nic więcej - innymi słowy chiałbym aby reagował na data-30, data-1 w oczywisty sposób.
3. Jeżeli taki sposób by nie był możliwy to można operować na strongach ale jest to czasochłonne i mozliwe że bezsensowne.
spenalzo
11.09.2003, 13:03:50
Cytat
3. Jeżeli taki sposób by nie był możliwy to można operować na strongach ale jest to czasochłonne i mozliwe że bezsensowne.
A co tu pracochłonnego i bezsensownego?! Przecież dzięki temu możesz łatwiej sortować, odejmować i formatować datę
DeyV
11.09.2003, 13:14:17
uff.
Ale czasem trdno zrozumiec, o co komuś chodzi.
Ale chyba w końcu mi sie udalo.
Wydaje mi się, ze może ci pomóc jedna z funckji MySQL z serii date, czyli DAYOFYEAR, UNIX_TIMESTAMP() i wykożystanie ich w zapytaniu.
Możesz też pobrać tylko msc zdarzenia (MONTH() ) i pobrać wszystkie dane z danego msca..
klag
11.09.2003, 13:18:01
Bo w końcu do czego mamy stworzonego sql'a ?!
Chciałbym i mam:
rekordy wybrane za pmocą zapytania np. z pomiędzy:
[sql:1:6a18a728e3]"select * from statystyki where stat_data>='".$data_1."' AND stat_data<='".$data_2."' [/sql:1:6a18a728e3]
To działa bez problemu:
a co z zapytaniem:
[sql:1:6a18a728e3]"select * from statystyki where AND stat_data=$data+$vector [/sql:1:6a18a728e3]
Jeżli coś takiego nie jest możliwe to będe pisał funkcje. Jezeli jest możliwe to po co pisać - Mysql sam powinien mieć takie operatory zrobione - i ja nie musze ich przeciążać bo przeciż baza wie że pole jest typu date ?
DeyV
11.09.2003, 13:30:56
[sql:1:4e038047e6]
SELECT *
FROM statystyki
WHERE
UNIX_TIMESTAMP(stat_data) > ( UNIX_TIMESTAMP() - $ilosc_dni*3600*24 )[/sql:1:4e038047e6]
klag
11.09.2003, 19:07:42
Dzięki - to działa poprawnie. Po dopisaniu kliku linijek cała funkcja działa przyzwoicie.
Mam nadzieję że ten cały post nadawał się na to forum
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.