Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Funkcje składowane a "obrabianie" danych np w PHP
Forum PHP.pl > Forum > Bazy danych
fragles
Pytanie moje to taki problem, nie umiem skonstruować jednego zapytania aby wybierało różnicę między wierszami, to zrobiłem sobie dwie procedury w MySQL, które tworzą tabelę tymczasową z której wysyłane są dane z takie o jakie mi chodzi

ale czy takie postępowanie jest słuszne i właściwe - wiąże się to z tworzeniem tabeli tymczasowej i przeniesieniu algorytmu z PHP do procedury w MySQL

czy może lepiej to zostawić w PHP, czego kosztem jest przesyłanie o wiele większej porcji danych - tak +/- - dokładnie tego nie sprawdzałem, zwykłe porównanie tego co dostaję z tym czego jest mi na prawdę potrzeba to jest to nadmiar o jakieś 2 do 3x więcej.

I w związku z tym co jest lepsze, wydajniejsze, szybsze zrobić obliczenia w bazie i w efekcie przesłac tyle danych ile trzeba, czy przesłac wszystko jak leci, a obliczenia zrobić w PHP - ja wiem że pewnie i inne czynniki mogą decydować, ale mi chodzi o jakąś ogólną zasadę, czym się kierować w takim przypadku
thomas2411
Można po prostu odjąć:
MYSQL operatory
fragles
można dodać ze znakiem przeciwnym,
ale to jest różnica między wierszami i to jeszcze dość specyficzny, ale skoro już się odezwałeś to może masz na to pomysł
w tabeli jest kolumna a w niej wartości (przykładowe), które po posortowaniu np wg daty dają taki wynik
1
12
33
45
46
56
57
48
29
20

i jak wybrać te i tylko te, aby w rezultacie odległość (wartość bezwzględna) była >=10 czyli
1
12
33
45
56
48
29
erix
http://nospor.pl/mysql-faq-n25.html#faq-7 ;]
fragles
już raz o tym pisałem
to nie jest pobieranie co n-tego wiersza
to jest pobieranie jakby odcinka czyli różnica między x1 a x2 musi być taka i już w przypadku gdybym miał pobrać co np 3 wiersz to taki zbiór
1)1
2)12
3)33
4)45
5)46
6)56
7)57
8)48
9)29
10)20
dałby taki wynik
3)33
6)56
9)29
a mnie chodzi o taki wynik
1)1
2)12
3)33
4)45
6)56
8)48
9)29
czyli różnica między liczbami w zbiorze wynikowym jest >=|10|

jak widać różnica - może i drobna - ale jest
erix
Ale korzystając chyba z tych zmiennych możesz wyliczyć różnicę...?

Trochę nie rozumiem, w jakim celu chcesz to robić; możesz nieco przybliżyć?
fragles
Cytat(erix @ 18.06.2009, 11:17:35 ) *
Ale korzystając chyba z tych zmiennych możesz wyliczyć różnicę...?


chyba mogę - ale pytanie jak to zrobić?
pewnie by trzeba jakieś złączenie tabeli z samą sobą robić, ale nie mam pomysłu co z czym - tabela klucz ma złozony
DATA WARTOŚC - i własnie o róznice tych wartosci mi chodzi

Cytat(erix @ 18.06.2009, 11:17:35 ) *
Trochę nie rozumiem, w jakim celu chcesz to robić; możesz nieco przybliżyć?


żeby mieć odcinki, a te odcinki narysować na canvasie - jako, że skalę wykresu mozna zmieniać to nie potrzebuję wszystkich punktów - tylko te, które będzie widać, bo po co mi punkty, które przy danej skali tworzą odcinek o długośco poniżej 1px

i dlatego właśnie ze zbioru tych wartości chcę wyciągnąć takie które będą tworzyły odcininki o długości np 10 czy 20
erix
Cytat
chyba mogę - ale pytanie jak to zrobić?
pewnie by trzeba jakieś złączenie tabeli z samą sobą robić, ale nie mam pomysłu co z czym - tabela klucz ma złozony

Nie. W zalinkowanej stronie masz przecież deklarowanie zmiennych.

Jedna niech się zwiększa co jeden za każdym rekordem, druga - tylko wtedy, jeśli spełnia warunek odległości. I odejmując je wybierasz ten rekord, który Cię interesuje.
fragles
Cytat(erix @ 18.06.2009, 12:13:17 ) *
Jedna niech się zwiększa co jeden za każdym rekordem, druga - tylko wtedy, jeśli spełnia warunek odległości. I odejmując je wybierasz ten rekord, który Cię interesuje.


Tylko jak sprawdzić czy spełnia warunek odległości?

bo zwiększa o 1 - ale jak sprawdzę czy rekord nazwijmy go bieżący - jest oddalony o jakąś odległość od rekordu poprzedniego, który nie musi być bezpośrednim poprzednikiem
erix
indeksBieżącego-indeksOstatnioPobranego = offset.

Skoro zlicza Ci indeks dla tych z zestawu spełniającego warunki, to?
fragles
Cytat(erix @ 18.06.2009, 14:04:38 ) *
indeksBieżącego-indeksOstatnioPobranego = offset.

Skoro zlicza Ci indeks dla tych z zestawu spełniającego warunki, to?


Dzięki za pomoc - chyba wreszcie załapałem o co chodzi - nie wiem czy to działa jak powinno, ale już chyba zrozumiałe zasadę, w kazdym razie jakby coś było niezbyt jasne to spytam

_________________________________

No i pojawił się problem z zawężaniem
o ile przy wyświetleniu wszystkiego ładnie to wygląda to gdy
w warunku WHERE chce to zawęzić
pn
WHERE @dystans >= liczba
to wychodzą głupoty

to samo w przypadku HAVING

np kolumnę z wyliczonym dystansem nazywam sobie dst
i gdy chcę w HAVING dac warunek
dst >= liczba nic nie wyswietla w wyniku

masz na to pomysł jakiś?
erix
Pokaż całe zapytanie, łącznie z deklaracją zmiennych.
fragles
juz sobie poradziłem - przykładowe rozwiązanie dla tych, którzy chcieliby coś podobnego zrobić (MySQL)


Problem
Zbiór wynikowy ma zawierać tylko rekordy, które utworzą ciąg, którego elementy będą oddalone od siebie o co najmniej X


Kod
   SET @distance=0;
     SET @prevkol=0;
  
   /*
  diffPT - minimalna odległość elementów w ciągu,
   kol3 - kolumna o którą chodzi, której wartości sa istotne i której wartości mają stanowić taki ciag
   */
  
   SELECT kol1,kol2,kol3,
   if(@prevkol>0,
   /*
   aby zaczynało się zawsze od pierwszego elementu jest rozróżnienie czy jest to pierwsza kolumna ze zbioru czy kolejna, akurat u mnie nie ma przypadku, że w kolumnie jest wartość 0 zawsze tam coś jest i zawsze będzie - jeśli istnieje u kogoś przypadek, że zero możebyć wartością komórki to trzeba to trochę przerobic np wg numeru
   SET @nr=0;
   IF(@nr>0)
   @nr:=@nr+1
    */
     IF(@distance>=diffPT ,(@distance:=0),@distance:=@distance+ABS(kol3-@prevkol)),@distance:=0
   ) AS diffKOL,
   @prevkol:=kol3
   FROM tabela
   WHERE kolDATAiCZAS>=dataiCzas /*i inne potrzebne warunki*/
   GROUP BY kolDATAiCZAS
   HAVING diffKOL=0 OR diffKOL>=diffPT
ORDER BY kolDATAiCZAS
;


niby nic takiego, ale trochę się namęczyłem - dzięki jeszcze raz za pomoc


ps - a wracając do tematu wątku - lepiej użyć funkcji składpwanych czy obrabiac dane w php
erix
Pewnie, że składowanych. Gdyż w rezultacie przepychasz mniej danych (są już przefiltrowane) z MySQL do klienta. W PHP musiałbyś używać ich zapewne nieco więcej.

Ale sytuacja naprawdę zależy - jeśli serwer SQL i http, to osobne maszyny - czasem może być pewien zysk czasowy.

Nie ma na to jednoznacznej odpowiedzi - w jednym zapytaniu DBMS użyje dodatkowych indeksów/sprawdzania i operację szybciej wykona baza, a w innym przypadku będzie na odwrót.

Trzeba po prostu wykonać własne testy.
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.