Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Nie wiem jak pobrać dane jednym zapytaniem
phoenix84
post
Post #1





Grupa: Zarejestrowani
Postów: 218
Pomógł: 0
Dołączył: 14.04.2004
Skąd: Słupsk, Nowy Sącz

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


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

Ten post edytował phoenix84 3.09.2016, 14:09:11
Go to the top of the page
+Quote Post
trueblue
post
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


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.

Ten post edytował trueblue 3.09.2016, 14:54:21
Go to the top of the page
+Quote Post
phoenix84
post
Post #3





Grupa: Zarejestrowani
Postów: 218
Pomógł: 0
Dołączył: 14.04.2004
Skąd: Słupsk, Nowy Sącz

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


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 (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
trueblue
post
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


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





Grupa: Zarejestrowani
Postów: 218
Pomógł: 0
Dołączył: 14.04.2004
Skąd: Słupsk, Nowy Sącz

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


chyba ogarne, dziekuje...

jak cos to jeszcze bede pytal... ale juz widze, ze sam bym na to nie wpadl... (IMG:style_emoticons/default/smile.gif)

wlasnie przy tym dlubie... (IMG:style_emoticons/default/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...

Ten post edytował phoenix84 3.09.2016, 19:13:53
Go to the top of the page
+Quote Post
trueblue
post
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


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





Grupa: Zarejestrowani
Postów: 218
Pomógł: 0
Dołączył: 14.04.2004
Skąd: Słupsk, Nowy Sącz

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


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ę (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
trueblue
post
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Ja miałem na myśli zmianę zapytania w tym kontekście, nie fakt używania.
Go to the top of the page
+Quote Post
phoenix84
post
Post #9





Grupa: Zarejestrowani
Postów: 218
Pomógł: 0
Dołączył: 14.04.2004
Skąd: Słupsk, Nowy Sącz

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


Zgubiłem się... (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.09.2025 - 04:40