Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nie wiem jak pobrać dane jednym zapytaniem
Forum PHP.pl > Forum > Bazy danych > MySQL
phoenix84
Chodzi o to, że z bazy chcę pobrać dane do wykresu... w bazie są dane posegregowane po czasie (unix_timestamp), ale nie są regularne... tzn czasem są co minutę, czasem co godzinę, a czasem nie ma przez miesiąc...

kiedy chcę pobrać sobie dane na dowolny moment, to po prostu daję to:

"SELECT `wartosc` FROM `dane` WHERE `czas`<=$czas ORDER BY `czas` DESC;"

i w ten sposób dostaję ostatnią znaną wartość na podany czas... problem się robi wtedy, kiedy chce zrobić z tego wykres... i np. 100 takich danych dla różnych czasów chcę uzyskać... jak to zrobić w jednym zapytaniu, a nie w 100?

Przyszło mi do głowy, by stworzyć podzapytanie dzielące $czas przez interwal jaki potrzebuję, wtedy po zaokrągleniu kolejne czasy będą kolejnymi intami... i wtedy zrobić WHERE BETWEEN, ale nie wiem czy to dobry trop i to się tak robi, czy może należy spróbować czegoś bardziej sensownego...

Przy czym nadal nie wiem jak uzyskać "komplet" danych... że jak nie ma danej dla danego czasu, to ma zwrócić ostatni poprzedni...

pozdrawiam,

Phoenix
trueblue
Który to ostatni poprzedni?

Przykład:
05:00 A
05:00 B
05:00 C
05:00 D
07:00 E
15:00 F
15:00 G

Który rekord mam wybrać dla 05:00, a który dla 10:00? Zakładamy interwał 5 minut.
phoenix84
Teoretycznie w bazie dla tego samego czasu musi być ten sam wynik i nie powinien się zdarzyć taki dubel... no chyba, że zrobimy ten numer z dzieleniem przez interwal... ale zakladajac czarny scenariusz, zawsze bierzemy najnowszy czyli najpozniejszy spelniajacy warunek...

Dla 05:00 będzie to D, a dla 10:00 E.

Przy interwale 5 minut nie ma problemu, bo wszystkie godziny są podzielne przez 5 minut smile.gif...

Na wszelki wypadek dam przykład dla godzin, gdzie to ma znaczenie:

Przykład:
05:00 A
05:00 B
05:00 C
05:00 D
07:00 E
15:00 F
15:00 G

Dla 6:59 będzie to D, dla 07:00 E, dla 07:01 E ... dla 14:59 E, dla 15:00 G, dla 15:01 G

Mam nadzieję, że teraz jasne. Dziękuję.

phoenix84
trueblue
Mam nadzieję, że się połapiesz.
Założenia:
- początek przedziału od 10:00,
- interwał co minutę,
- długość interwału 100 minut,

http://sqlfiddle.com/#!9/b4617a/1
phoenix84
chyba ogarne, dziekuje...

jak cos to jeszcze bede pytal... ale juz widze, ze sam bym na to nie wpadl... smile.gif

wlasnie przy tym dlubie... smile.gif

pozdrawiam i dziekuje,

phoenix84

a jak mam w bazie czasy uniksowe (int) a nie date? to jak te linie przerobic? interwal tez jest int w sekundach...

SEC_TO_TIME(TIME_TO_SEC(STR_TO_DATE('10:00', '%H:%i')) + a.sekunda*60) as interwal,
TIME_TO_SEC(DATE_ADD(STR_TO_DATE('10:00', '%H:%i'),INTERVAL a.sekunda*60 SECOND))-TIME_TO_SEC(TIME(z.czas)) as roznica

?

i od czego zalezy, ze wybiera zlecenie 2 lub 3? bo powinno albo zawsze jedno, albo zawsze drugie, a nie widze zasady...
trueblue
Przy równych wartościach wynik ORDER BY jest nieokreślony.
Jeśli chcesz "ustabilizować" wynik, to w GROUP_CONCAT możesz dodać kolejne pole do ORDER BY (np. jakieś id).

https://dev.mysql.com/doc/refman/5.5/en/dat...n_from-unixtime
Przy czym jeśli zamiast konwertować timestamp na datę, być może łatwiej by było operować od razu na timestamp.
phoenix84
Cytat(trueblue @ 3.09.2016, 20:31:42 ) *
https://dev.mysql.com/doc/refman/5.5/en/dat...n_from-unixtime
Przy czym jeśli zamiast konwertować timestamp na datę, być może łatwiej by było operować od razu na timestamp.


O tym mówię smile.gif. Ja od razu operuję na timestamp (nie uzywam nic innego przez pozniejsze problemy ze strefami czasowymi i innymi problemami). Napisałem to w pierwszym poście: "w bazie są dane posegregowane po czasie (unix_timestamp)".

Jak pominąć te wszystkie konwersje, bo i czas w bazie jest w timestamp i interwal bedzie jako int w sekundach (czyli bedzie np. 90, a nie 00:01:30)...

phoenix84
trueblue
Ja miałem na myśli zmianę zapytania w tym kontekście, nie fakt używania.
phoenix84
Zgubiłem się... smile.gif

duży to problem zamienić na timestampy?

podeślij też jakiś adres bitcoinowy do dotacji na browar za pomoc jak mi to już będzie działać...

phoenix84
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.