Skocz do zawartości

[MYSQL] data/wykres


Mar

Rekomendowane odpowiedzi

Witam,

Aktualizuję sobie swój monitor pozycji, poprzez przedstawianie go na wykresie amcharts, codziennie do bazy zapisywana jest pozycja w postaci:

|cos|cos|pozycja|data

i w przypadku braku "pozycji" rekord nie był dodawany, i pojawił się problem gdy generuję wykres np. z ostatnich 30 dni, bo wtedy gdy nie była pobierana pozycja, lub jej nie było na wykresie jest to pomijane.

I przychodzą mi dwa rozwiązania, ale żadne mnie jakoś nie zadowala:

1. uzupełnienie brakujących dat pozycjami "-", ale wtedy jak cron się nie odpali... bo akurat coś nie działało, znów pojawi się dziura, więc co jakiś czas należało by to uzupełniać, a po drugie to dodatkowy niepotrzebny rekord w bazie.

2. podczas generowania listy pozycji, która jest postaci .csv (data;pozycja) pobierać dane z kalendarza, i wtedy sprawdzać jaka była pozycja danego dnia, lub jak nic nie ma, to dać np. "-", ale pytanie jak, skąd pobierać, że luty miał 29 dni itp. podczas zapytania sql?

I jak generować takie zapytania, obecnie mam coś takiego:

(SELECT * FROM pozycje WHERE id_slowa=id_slowa ORDER by data DESC LIMIT 0,30) ORDER by data ASC'

Jakieś pomysły? Na pewno ktoś coś takiego ma w swoich skryptach...

..a tak w skrócie, potrzebuję wyświetlić historię pozycji miesiąc w tył, uwzględniając braki.

Z góry dzięki.

Mar.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

Ile ma dni miesiąc:

$rok = 2009;
$mies = 2;
echo  date("t", mktime(0,0,0,$mies,1,$rok)).'<br />';

Jak wyświetlać uwzględniając brakujące dane koncepcji może być kilka...

NP pobierasz dane z wszystkich dni z przedziału od dnia do dnia ostatniego dla danego miesiąca do tablicy następnie w pętli

for(iledni_dla_danego_miesiaca) literujesz i sprawdzasz czy nr dnia masz w pobranych danych jeśli jest wstawiasz pozycje dla danego dnia jeśli nie to jakiś znak. Dzięki temu masz wykres dla wszystkich dni w miesiącu niezależnie czy dla danego dnia jest zapisany rekord w bazie. Innymi słowy nie masz "dziury" w dniach miesiąca na wykresie :)

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki, to by mnie nawet urządzało, ale gdybym chciał wyświetlać np. luty, marzec itp.

Bo wrzucił bym w to w pętlę, np. od 1. do 31 i za każdym razem i tu już mamy o zgrozo 31 zapytań do bazy.

.. a mi by najbardziej pasowało wyświetlić np. od 18.04 do 18.05.

A mógłbyś podać kilka takich koncepcji?

Mar.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

Koncepcję dodałem "po edycji" :)

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, dzięki, będę testował... choć ta Twoja koncepcja też strasznie "rozbudowana" jedna tablica, a później budowa kolejnych dla dwóch miesięcy.... porównywanie itp...

ehh... myślałem, że to będzie mniej skomplikowane, ale chyba to jedyna droga... bo nie ma co bazy zapychać.

Muszę się z tym przespać, może coś mi jeszcze do głowy przyjdzie...

Mar.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

Ale co tu jest "strasznie rozbudowanego" ? Pobierasz rekordy jednym zapytaniem i wyświetlasz w jednej pętli - nic więcej. Przynajmniej przyjmując jako skale na wykresie od 1 do ostatniego dnia danego miesiąca :)

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

E tam trudna droga :)

Najpierw przy odpytywaniu bazy danych wrzucasz dane do tablicy $pozycja['data'] = 'pozycja'; i potem przelatujesz pętlą:

for($i = 1; $i <= $ilosc_dni_w_miesiacu; $i++)
if (array_key_exists($i, $pozycja))
$pozycja[$i] = '-';

i chyba tyle o ile nic źle nie zrobiłem bo śpiacy jestem :) (jakoś się dwie ostanie nocki nie przespały :-) )

logo-stat4seo-blue-small.png

Odnośnik do komentarza
Udostępnij na innych stronach

Jutro nad tym posiedzę.... a nie, że skomplikowane.. ale trochę pisania jest :D

Bo należy wziąć pod uwagę, że w grę wchodzą dwa miesiące, od danego do danego miesiąca, np. 18.04 - 18.05

Czyli należy pobrać te wszystkie rekordy, przepuścić przez pętlę od 18 do końca kwietnia,

a następnie drugą pętlę od 1 do 18 maja, a nie jak powyżej cały miesiąc...

Mar.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

A pisałem, że będzie z tym trochę zabawy, i gdy już myślałem, że koniec pojawił się problem z tablicą, jak ją posortować wg daty?

$rok = date("Y");
$mies_akt = date("m");
$dzis = date("d");
$data = date("Y-m-d H:i:s");
$mies_po = date('m', strtotime($data.' -1 month'));
$d1 = date("Y-m-d", strtotime($data.' +1 day'));
$d2 = date('Y-m-d', strtotime($data.' -1 month'));
$mies_po_dni = date("t", mktime(0,0,0,$mies_po,1,$rok)).'<br />';
$mies_akt_dni = date("t", mktime(0,0,0,$mies_akt,1,$rok)).'<br />';

for($i = $dzis; $i <= $mies_po_dni; $i++) {
$pozycja[$i.'-'.$mies_po.'-'.$rok] = '-';
}
for($i = 1; $i <= $dzis; $i++) {
$pozycja[$i.'-'.$mies_akt.'-'.$rok] = '-';
}
$sql = '(SELECT * FROM pozycje WHERE id_slowa='.$id_frazy.' AND (data BETWEEN \''.$d2.'\' AND \''.$d1.'\') ORDER by data DESC) ORDER by data ASC'; 
	$result = mysql_query ($sql); 
	 while ($fetch = mysql_fetch_assoc($result)) {
		$data1 = date("d-m-Y",strtotime($fetch[data]));
		$pozycja[$data1] = $fetch[pozycja];
	 }
foreach ($pozycja as $key => $value)
{
  echo $key.';'.$value."<br />\n";
}

Powyższy fragment daje mi dane typu:

...

17-05-2009;7

18-05-2009;4

19-05-2009;3

01-05-2009;10

02-05-2009;10

...

..ma ktoś jakiś pomysł?

Mar.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

U siebie, w indeksie tablicy przechowuje jedynie dzień miesiąca i wg. niego sortuje. Hmm....

Może zamień klucz w tablicy na date w formacie ISO (yyyy-mm-dd) w wtedy powinieneś móc posortować to zwykłym ksort().

edycja: pozostaje jeszcze użycie uksort razem z callback oraz strcmp. ;)

logo-stat4seo-blue-small.png

Odnośnik do komentarza
Udostępnij na innych stronach

A może zamiast tego

		 while ($fetch = mysql_fetch_assoc($result)) {
		$data1 = date("d-m-Y",strtotime($fetch[data]));
		$pozycja[$data1] = $fetch[pozycja];
	 }

zrób

		 while ($fetch = mysql_fetch_assoc($result)) {
		$pozycja[strtotime($fetch[data])] = $fetch[pozycja];
	 }

a później już tylko

ksort ($pozycja);

foreach ($pozycja as $key => $value)
{
  echo date("d-m-Y",$key).';'.$value."<br />\n";
}

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki, wystarczyło zamienić format daty, widocznie przy tworzeniu pustej tablicy data stawała się stringiem,

po zamianie funkcja sortowania jest już zbędna.

Mar.

Polecam katalog SeoPark.pl, katalog AK47 (5 lata w sieci) ...oraz Wirtualne-miasta.eu
"Dopóki nie skorzystałem z Internetu, nie wiedziałem, że na świecie jest tylu idiotów" - Stanisław Lem

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności