[MySQL] Ograniczenie liczby zapytan
Sarenka - 24-07-2006 00:27
[MySQL] Ograniczenie liczby zapytan
Mam taki oto problemik. Mam baze danych, w ktorej istaniejacych tabel zmienia nie moge - conajwyzej dodawac tabele. jest tabela pomiary a w niej kolumna tabel_wyn w ktorej jest numer - np 30. Okresla on numer tabeli (ten pomiar zwrocil wynik w tabeli - dokladnie chodzi o pomiar natezenia dzwieku i pomiar zwraca natezenie dzwieku na roznych czestotliwosciach). Ten numer tabeli okresla nam wartosc pola `Numer tabeli` z tabeli tabele: +----------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+------------------+------+-----+---------+-------+ | Numer tabeli | int(10) unsigned | | PRI | 0 | | | Numer wartosci | int(11) | | PRI | 0 | | | Wartosc | double | | | 0 | | +----------------+------------------+------+-----+---------+-------+
a teraz problem... Pomiary sa wykonane co godzine w systemie 24/7, czyli za rok mam niecale 9000 pomiarow. Skrypt ma wyswietlic to w postaci obrazka (sonogram - na 2 wymiarowym wykresie 3 wartosci - uzywamy osi x, osi y oraz koloru pola). Zmiesci sie na nim maksymalnie 72 wyniki, wiec to co jest w bazie trzeba redukowac. Zalozenie - wybieramy z danej grupy ten pomiar, ktorego sumaryczny wynik jest najwiekszy (sumuje wartosci z kolumny `Numer wartosci`). Jak najlepiej skonstruowac zapytanie/a, by ich ilosc nie szla w tysiace? Czy dalo by sie na poziomie samego zapytania z php przesylanego kazac pogrupowac wyniki pomiarow po x (np. 100 czy 120) i zwrocic tylko ten, ktory ma najwieksza sume?
-- Sarenka (ale facet) I tak i nie wiem czego chce :)
Wojtek pBT (prac) - 25-07-2006 00:38
Sarenka napisał(a): > Mam taki oto problemik.
Tyle jesteś na grupie i jeszcze się nie nauczyłeś... Podaj coś więcej na temat tego swojego MySQL, częstotliwość wykonywania zapytania o którym mówisz i akceptowalny czas oczekiwania na odpowedź.
2) podaj wszystkie tabele z których zapytanie ma korzystać.
Nie wiem, czy nie chodzi Ci np o takie coś:
SELECT max(Wartosc) FROM tab GROUP BY nr_tab, IF(nr_wart> 100, 1,IF(nr_wart>200,2,IF(nr_wart>300,3,[...])))
Przy czym możliwe, że będziesz musiał używać składni: IF(nr_wart>300 AND nr_wart<=400)
Jeżeli masz datę pomiaru, to całość znacznie się upraszcza, bo robisz grupowanie po odpowiednio prze formatowanej dacie: np ROK-nr_tygodnia
pBT
Paweł Matejski - 25-07-2006 03:23
Wojtek pBT (prac) wrote:
> Nie wiem, czy nie chodzi Ci np o takie coś: > > SELECT max(Wartosc) FROM tab GROUP BY nr_tab, IF(nr_wart> 100, > 1,IF(nr_wart>200,2,IF(nr_wart>300,3,[...])))
a nie prościej: GROUP BY całkowita(nr_wart/100) całkowita() należy zamienić na odpowiednią funkcje lub rzutowanie. :)
-- P.M.
Wojtek pBT (prac) - 25-07-2006 03:23
Paweł Matejski napisał(a): > Wojtek pBT (prac) wrote: > >> Nie wiem, czy nie chodzi Ci np o takie coś: >> >> SELECT max(Wartosc) FROM tab GROUP BY nr_tab, IF(nr_wart> 100, >> 1,IF(nr_wart>200,2,IF(nr_wart>300,3,[...]))) > > a nie prościej: GROUP BY całkowita(nr_wart/100) > całkowita() należy zamienić na odpowiednią funkcje lub rzutowanie. :) >
mea culpa, mea maxima culpa
Dzieki, pBT
Sarenka - 26-07-2006 01:31
>> Mam taki oto problemik. > > > Tyle jesteś na grupie i jeszcze się nie nauczyłeś...
Ale rzadko sie udzielam :p
> Podaj coś więcej na temat tego swojego MySQL, częstotliwość wykonywania > zapytania o którym mówisz i akceptowalny czas oczekiwania na odpowedź.
Nie mniej masz racje. Czestotliwosc - raczej nie do oszacowania przeze mnie. Akceptowalny czas oczekiwania - wcale :)
> 2) podaj wszystkie tabele z których zapytanie ma korzystać.
No tutaj miedzy innymi mam problem... Jak pisalem, to nie moja baza i nie moge jej struktury tknac (a, ze jest imho lekko dyskusyjna, to zupelnie inny temat). Zadanie jest takie: w formie wykresu sonogramowego zobrazowac wyniki pomiarow. Jak dane sa bazie trzymane juz podalem. Odpada tworzenie wykresow z gory, bo za duzo jest kombinacji tego - user ma miec mozliwosc wybrania dowolnego przedzialu czasowego. Jest tylko limit dolny - jeden dzien. Maksymalny nie byl brany pod uwage, ale musze wykladowce przekonac do powiedzmy 1 roku. Z tym, ze przedzial roku a nie ostatni rok (czyli np. od maja zeszlego do maja tego roku).
> Nie wiem, czy nie chodzi Ci np o takie coś: > > SELECT max(Wartosc) FROM tab GROUP BY nr_tab, IF(nr_wart> 100, > 1,IF(nr_wart>200,2,IF(nr_wart>300,3,[...]))) > > Przy czym możliwe, że będziesz musiał używać składni: > IF(nr_wart>300 AND nr_wart<=400) > > Jeżeli masz datę pomiaru, to całość znacznie się upraszcza, bo robisz > grupowanie po odpowiednio prze formatowanej dacie: np ROK-nr_tygodnia
Mam date co do godziny (format pola datetime)
-- Sarenka (ale facet) I tak i nie wiem czego chce :)
Sarenka - 26-07-2006 01:31
Wojtek pBT (prac) napisał(a): > Paweł Matejski napisał(a): > >> Wojtek pBT (prac) wrote: >> >>> Nie wiem, czy nie chodzi Ci np o takie coś: >>> >>> SELECT max(Wartosc) FROM tab GROUP BY nr_tab, IF(nr_wart> 100, >>> 1,IF(nr_wart>200,2,IF(nr_wart>300,3,[...]))) >> >> >> a nie prościej: GROUP BY całkowita(nr_wart/100) >> całkowita() należy zamienić na odpowiednią funkcje lub rzutowanie. :) >> > > mea culpa, mea maxima culpa > > Dzieki, pBT
Dziekuje obu Panom. Potestuje i podziele sie rezultatami.
-- Sarenka (ale facet) I tak i nie wiem czego chce :)
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
MySQL - jak =?ISO-8859-2?Q?wyeksportowa=E6_zawarto=B6=E6_wie?==?ISO-8859-2?Q?lkiej_tabeli?=
zanotowane.pldoc.pisz.plpdf.pisz.plshutter.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|