![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Ciężko mi nazwać temat bo nie mam pojęcia jak to nazwać, a ogólnie problem prosty.
Dane z bazy wyciągnięte dzięki GROUP BY i funkcji date ORAZ SUM type date SUM xxx 2008-03-27 1 xxx 2008-03-30 6 xxx 2008-04-04 1 xxx 2008-04-05 2 xxx 2008-04-06 8 xxx 2008-04-07 2 xxx 2008-04-08 3 xxx 2008-04-09 2 (xxx to jakiś typ usługi, data zamówienia i suma w danym dniu). Dane pobieram do wykresu, który przyjmuje wartości w formie json co jest mniej istotne. Istotne mianowicie jest, że podaje je po przecinku, a wykres sam podstawia pod daty i prowadzi to do błędu w przypadku przerw. Chciałbym dostać tablice, z wszystkimi indeksami wraz z lukami z wartością ZERO. type date SUM xxx 2008-03-27 1 xxx 2008-03-28 0 xxx 2008-03-29 0 xxx 2008-03-30 6 itd. Wykres przyjmuje wartości w postaci 1, 0, 0, 6 i można się domyśleć, że brak zer spowoduje przesunięcie. Może to się da zrobić na poziomie samego zapytania (mysql), jeśli nie to jak to zrobić po stronie php? Oczywiście mogę puścić pętle iterującą po kolejnych dniach ale to wygeneruje kilkaset zapytań (tyle ile dni) do bazy - raczej mało optymalne. Poza tym tych typów jest kilka i ostatecznie chciałbym otrzymać kilka tablic - oddzielnie dla każdego. Ten post edytował markonix 26.12.2010, 22:56:09 -------------------- |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 748 Pomógł: 388 Dołączył: 21.08.2009 Skąd: Gdynia Ostrzeżenie: (0%) ![]() ![]() |
można to zrobić jednym zapytaniem
1. Pobierasz te dane i wrzucasz do tablicy, gdzie klucz to będzie data, a wartość to co masz czyli: ['2008-03-27'] => xxx 2008-03-27 1 ['2008-03-30'] => xxx 2008-03-30 6 ['2008-04-04'] => xxx 2008-04-04 1 2. następnie używając modyfikacji tej funkcji http://prajapatinilesh.wordpress.com/2009/...using-php-code/ wygenerujesz tablicę z kluczami do wszystkich data z przedziału i wartościami 0 3. używając funkcji http://php.net/manual/en/function.array-merge.php, połączysz obie tablice, w ten sposób te daty, które posiadają wartości nadpiszą te z zerami czyli ['2008-03-27'] => 0 zostanie zastąpione przez ['2008-03-27'] => xxx 2008-03-27 1, dla pozostałych zostanie 0 w ten sposób otrzymasz tablicę z datami z przedziału od/do , z brakującymi wartościami jako 0 tutaj masz modyfikację:
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Dziękuje, zaraz spróbuje.
Tymczasem wpadłem na podobny pomysł ale po stronie mysql. Stworzyć bazę o strukturze analogicznej do tablicy z pętli Twojego skryptu (data i zero), a następnie też łączenie tylko w przypadku baz chodzi oczywiście o JOIN. -------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 748 Pomógł: 388 Dołączył: 21.08.2009 Skąd: Gdynia Ostrzeżenie: (0%) ![]() ![]() |
na tablicy będzie wydajniej, nie ma sensu obciążać bazy danych do takich operacji, zwłaszcza, że możesz sobie to ładnie opakować w funkcje i wywoływać jedną linijką kodu
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Miałem pewne opory ze względu na to, że tablica ma pewne ograniczenia pamięciowe i kiedyś skrypt mi się wysypał stąd uraz
![]() Twoje porady się sprawdziły choć array_merge nie do końca spełniło oczekiwania co do drugiego indeksu - typu usługi. Ładowało zerami tylko gdy nie było żadnej usługi, żadnego typu. Gdy choć jedna była w danym dniu to już omijał i zostawiał jak było. Ale byłem pewien, że ktoś chciał osiągnąć taki efekt jak ja i wypróbowałem wszystkie funkcje na php.net Gdzieś za 5tym razem trafiłem:
Dzięki za pomoc. Ten post edytował markonix 27.12.2010, 01:39:36 -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 09:10 |