Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie co któegos wpisu
Forum PHP.pl > Forum > Bazy danych > MySQL
Kuziu
Czesc,

dawno tu nie zagladalem smile.gif

Mam taki problem:

bede rysowal wykres na podstawie danych z MySQL'a, jednak wykres bedzie zoomowany, i np. przy duzym oddaleniu bede pobieral spory okres czasu i chcialbym uniknac pobierania zbednych danych.

Jest mozliwosc pobrania np. co 10 wpisu ? Ze robie: SELECT * FROM tabela (i tutaj cos co pobierze zamiast wszystkich wpisow to co 10)

A jeszcze lepiej gdyby sie dalo pobrac srednia z tych 10 wpisow, czyli kazde 10 wpisow pobieram jako 1 z ich srednia wartoscia.


Z gory dzieki
Mchl
Wszystko się da, tylko powiedz jak wygląda dziedzina tego wykresu.

Jeżeli na przykłąd byłyby to kolejne liczby naturalne to można:
WHERE MOD(x,5) = 0 -- wybiera co piąty

SELECT AVG(y) FROM table GROUP BY TRUNCATE(x/10,0) -- liczy średnią z kolejnych grup po 10
Kuziu
Wykres ma przedstawiac liniowe odwzorowanie parametrow ktore wysyla pewne urzadzenie.

W bazie zapisywana jest wartosc parametru oraz czas kiedy urzadzenie wyslalo parametr. Zazwyczaj zapis jest w rownych odstepach czasowych jednak zdarza sie ze urzadzenie nie wysle danego parametru przez pewien okres.

I teraz chodzi o to ze musze pobrac w sumie nie tyle co ktorys wpis (np. co dziesiąty) tylko pobrac do wykresu srednia wartosc okresow czasowych.

Wykres ma skale czasowa, i chce na niej umiescic na poczatku wartosci średnie z okresów minutowych.
Pozniej uzytkownik wciska przycisk >przybliż wykres<, i teraz musze pokazać średnie wartości z okresów 30 sekundowych.

Z zalozeniem ze 1 pixel odpowiada 1 okresowi, niezaleznie czy jest to minuta, 10 minut czy 30 sekund.

Ah i jeszcze 1... pomyliłem działy, robię to w SQLite =[ Proszę o przeniesienie
Mchl
No to od tego momentu zastrzegam, że nie wiem czy w SQLite tak można

Zamień te stemple czasowe na UNIX TIMESTAMP (pewnie jest jakaś funkcja do tego) i jedziesz j.w.

W MySQL byłoby to tak
Kod
SELECT AVG(y) FROM table GROUP BY TRUNCATE(UNIX_TIMESTAMP(x)/60,0)
Kuziu
GROUP BY TRUNCATE z tego co widze nie dziala raczej.

Może pokażę na przykładzie o co mi chodzi:

Cytat
ID WARTOSC TIME
1......300..........957
2......400..........962
3......500..........970

4......300..........987
5......300..........990
6......300..........995

7......500..........1007
8......700..........1027


I wynikiem powinno byc dla okresów co 30 sekund czyli (950-979) (980-1009) (1010-1029):

Cytat
WARTOSC TIME
400.........957
300.........987
600.........1007


Moje zapytanie mialo by wygladac jakos tak (wiem ze tak nie zadziala, proboje jakos rozumowac po ludzku :/)

Cytat
SELECT AVG(wartosc), time FROM tabela WHERE (time > (950 + 30 * licznik) AND time < (950 + 30 * licznik + 29)) GROUP BY licznik


Gdzie zmienna licznik byla by iloscia iteracji pasujących do tego zapytania.

Przykład dla licznika = 0: WHERE (time > (950) AND time < (979))
Przykład dla licznika = 1: WHERE (time > (980) AND time < (1009)) bo (950 + 30 * 1) = 980 i (950 + 30 * 1 + 29) = 1009


Sorki ale ciezko mi to wytlumaczyc.
Mchl
Zamiast TRUNCATE użyj ROUND
http://www.sqlite.org/lang_corefunc.html

A UNIX_TIMESTAMP możesz opuścić, bo już masz czas w sekundach.
Kuziu
O kurde ale jestem w szoku smile.gif Pozytywnym. Dzięki wielkie, widzę że jeszcze nauki a nauki przede mną w temacie baz danych.

Jeszcze raz dzięki!
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.