[MySQL]Przeszukiwanie
Rep - 25-04-2006 00:02
[MySQL]Przeszukiwanie
Witam,
Jestem newbie w temacie bazdanych, prosilbym o nakierowanie. Chce przeszukac kolumne stringow (numery IP), aby sprawdzic czy znajduje sie w niej konkretny string (dany numer IP). Robie to w taki sposob.
SELECT (ip) FROM mytable WHERE ip="127.0.0.1"
Jesli zwroci pustego seta, tzn. ze go tam nie ma. Czy to dobry sposob? Czy tez wykonuje sie to inaczej, np. porownujac jakos strigni w bazie ze wzorcem i zwracajac wartosc typu logicznego? Drugie pytanie dotyczy ilosci przeszukiwanych pol, jaka funkcje nalezy zastosowac aby przeszukiwac np. tylko 100 ostatnio dodanych?
Pozdr.
Lemat - 25-04-2006 00:02
Rep napisał(a):
> Jestem newbie w temacie bazdanych, prosilbym o nakierowanie. Chce przeszukac > kolumne stringow (numery IP), aby sprawdzic czy znajduje sie w niej > konkretny string (dany numer IP). Robie to w taki sposob. > > SELECT (ip) FROM mytable WHERE ip="127.0.0.1"
select count(ip) as ilosc ...
zastanowiłbym się tez nad zamianą IP (*char) na 32bitowego inta - powinno być szybciej
> Drugie pytanie dotyczy ilosci > przeszukiwanych pol, jaka funkcje nalezy zastosowac aby przeszukiwac np. > tylko 100 ostatnio dodanych?
musisz mieć dodatkową kolumnę z wartością typu autoincerement/datą dodania rekordu, posortować po tej kolumnie - zawartość bazy przypomina zbiór a nie ciąg = nie ma ustalonej kolejności, dopóki jej nie narzucisz przez ORDER BY. Jak już masz uporządkowanie to stosujesz LIMIT.
-- Pozdrawiam Lemat abuse z amm.net.pl: SPAM to nie zamówiona przesyłka reklamowa wysłana do odbiorcy bez jego zgody. W przypadku Usenet to nie zachodzi - Pana sam pobrał tę pocztę - konfigurując konto grupy w swoim komputerze, tym samym wyrażając zgodę na odbieranie wszystkiego co tam jest.
Rep - 25-04-2006 00:02
Wielkie dzieki za odpowiedz.
> select count(ip) as ilosc ...
Czy moglbys to troche rozwinac? Ogolnie programuje w Javie, robie sobie strone przy uzyciu JSP i Servletow i tworze sobie poll'a. Chce zablokowac mozliwosc powtornego glosowania po numerze IP. Na razie chce tylko oganiczyc na podstawie ilosci oddanych glosow, czyli np. jak w 100 ostatnich bedzie IP danego klienta to nie bedzie mial mozliwosci glosowania. Jak lepiej poznam bazy to uzaleznie to od daty oddania glosu i numeru IP, czyli np. glos bedzie mozna oddac raz w miesiacu.
> musisz mieć dodatkową kolumnę z wartością typu autoincerement/datą dodania > rekordu, posortować po tej kolumnie - zawartość bazy przypomina zbiór a > nie ciąg = nie ma ustalonej kolejności, dopóki jej nie narzucisz przez > ORDER BY. Jak już masz uporządkowanie to stosujesz LIMIT.
Moja tabela wyglada tak. Rekory dowolne np.
+---+-------+---------------+------------------------+ | id | choice | ip | time | +---+-------+---------------+------------------------+ | 1 | 5 | 127.0.0.1 | 2006-04-24 10:12:56 | | 2 | 4 | 113.14.45.1 | 2006-04-24 10:15:16 | | 3 | 1 | 127.0.0.1 | 2006-04-24 10:16:34 | | 4 | 9 | 127.0.0.1 | 2006-04-24 10:16:40 | | 5 | 7 | 223.54.78.8 | 2006-04-24 10:20:12 | +---+-------+---------------+------------------------+
Kiedy uzywam:
SELECT COUNT(ip) WHERE ip = "127.0.0.1" FROM mytable ORDER BY time LIMIT 3;
To oczywiscie najpierw wybierze mi ilosc wystapienia tego IP, a dopiero potem posortuje i ograniczy do trzech, co kompletnie nie ma zadnego sensu. W zwiazku z tym mam dwa pytania.
1). Jak najpierw posortowac i ograniczyc, a potem wybrac?
2). "ORDER BY time" sortuje mi od najstarszych do najnowszych i LIMIT zaweza mi wlasnie taki wynik. Jak posortowac od najnowych do najstarszych? Tak zeby sprawdzal 100 ostatnio dodanych, a nie 100 poczatkowych?
Jeszcze raz wielkie dzieki za pomoc.
Rep - 25-04-2006 00:02
Ok, mialem chwile, znalazlem DESC aby posortowac odwrotnie.
Moze ktos mnie naprowadzi chociaz w ktorym kierunku szukac rozwiazania, aby najpierw posortowac, a potem wybrac?
=?ISO-8859-2?Q?Micha=B3=3FKuratczyk?= - 25-04-2006 00:02
Rep wrote: > Moze ktos mnie naprowadzi chociaz w ktorym kierunku szukac rozwiazania, > aby najpierw posortowac, a potem wybrac? LIMIT działa dokładnie w ten sposób, a nie tak jak napisałeś wcześniej.
http://dev.mysql.com/doc/refman/5.0/...imization.html
If you use LIMIT row_count with ORDER BY, MySQL ends the sorting as soon as it has found the first row_count rows of the sorted result, rather than sorting the entire result. If ordering is done by using an index, this is very fast. If a filesort must be done, all rows that match the query without the LIMIT clause must be selected, and most or all of them must be sorted, before it can be ascertained that the first row_count rows have been found. In either case, after the initial rows have been found, there is no need to sort any remainder of the result set, and MySQL does not do so.
Tajemnicą pozostaje dla mnie natomiast sens tego zapytania: SELECT COUNT(ip) WHERE ip = "127.0.0.1" FROM mytable ORDER BY time LIMIT 3;
Co Ty właściwie chcesz tu osiągnąć?
-- Michał Kuratczyk
Rep - 25-04-2006 00:02
Użytkownik "Michał?Kuratczyk" <kura@lj.pl> napisał w wiadomości news:e2ip0j$1o5$1@abg.com.pl... > Rep wrote: >> Moze ktos mnie naprowadzi chociaz w ktorym kierunku szukac rozwiazania, >> aby najpierw posortowac, a potem wybrac? > LIMIT działa dokładnie w ten sposób, a nie tak jak napisałeś wcześniej. > > http://dev.mysql.com/doc/refman/5.0/...imization.html > > If you use LIMIT row_count with ORDER BY, MySQL ends the sorting as soon > as > it has found the first row_count rows of the sorted result, rather than > sorting the entire result. If ordering is done by using an index, this is > very fast. If a filesort must be done, all rows that match the query > without the LIMIT clause must be selected, and most or all of them must be > sorted, before it can be ascertained that the first row_count rows have > been found. In either case, after the initial rows have been found, there > is no need to sort any remainder of the result set, and MySQL does not do > so.
Na wstepie chcialem podziekowac za zainteresowanie. Jak rozumiem, sortuje tylko to co jest ustalone przez LIMIT (a nie wszystko i potem dopiero ogranicza). Jednakze nie potrafie dostrzec jak moze mi to pomoc w rozwiazac mojego problemu.
> Tajemnicą pozostaje dla mnie natomiast sens tego zapytania: > SELECT COUNT(ip) WHERE ip = "127.0.0.1" FROM mytable ORDER BY time LIMIT > 3; > > Co Ty właściwie chcesz tu osiągnąć?
Jesli chodzi o zapytanie, ktor zacytowales, tam nie powinno byc COUNT, czyli:
SELECT (ip) WHERE ip = "127.0.0.1" FROM mytable ORDER BY time LIMIT 3;
Tak jak napisalem wczesniej, to zapytanie nie ma zadnego sensu, poniewaz z tego co moge zaobserwowac i jak podpowiada mi logika, najpierw wybierze mi pola z tym numerem ip, a dopiero taki juz otrzymany set, posortuje wedlug daty. Ja chcialbym na odwrot. Tzn. chce sprawdzic czy w np.100 ostatnio dodanych rekordach znajduje sie taki a taki numer IP. Czyli wedlug mnie, powinienem wybrac 100 ostatnio dodanych rekordow (posortowane wedlug daty), i majac taki juz wynik sprawdzic czy znajduje sie w nim dany numer IP.
=?iso-8859-2?Q?Andrzej_Str=F3=BFy=F1ski?= - 26-04-2006 01:22
Użytkownik "Rep" napisał: > Użytkownik "Michał?Kuratczyk" <kura@lj.pl> napisał w wiadomości > news:e2ip0j$1o5$1@abg.com.pl... >> Rep wrote: >>> Moze ktos mnie naprowadzi chociaz w ktorym kierunku szukac rozwiazania, >>> aby najpierw posortowac, a potem wybrac? >> LIMIT działa dokładnie w ten sposób, a nie tak jak napisałeś wcześniej. >> >> http://dev.mysql.com/doc/refman/5.0/...imization.html >> >> If you use LIMIT row_count with ORDER BY, MySQL ends the sorting as soon >> as >> it has found the first row_count rows of the sorted result, rather than >> sorting the entire result. If ordering is done by using an index, this >> is >> very fast. If a filesort must be done, all rows that match the query >> without the LIMIT clause must be selected, and most or all of them must >> be >> sorted, before it can be ascertained that the first row_count rows have >> been found. In either case, after the initial rows have been found, >> there >> is no need to sort any remainder of the result set, and MySQL does not >> do >> so. > > Na wstepie chcialem podziekowac za zainteresowanie. Jak rozumiem, sortuje > tylko to co jest ustalone przez LIMIT (a nie wszystko i potem dopiero > ogranicza). Jednakze nie potrafie dostrzec jak moze mi to pomoc w > rozwiazac mojego problemu. > >> Tajemnicą pozostaje dla mnie natomiast sens tego zapytania: >> SELECT COUNT(ip) WHERE ip = "127.0.0.1" FROM mytable ORDER BY time LIMIT >> 3; >> >> Co Ty właściwie chcesz tu osiągnąć? > > Jesli chodzi o zapytanie, ktor zacytowales, tam nie powinno byc COUNT, > czyli: > > SELECT (ip) WHERE ip = "127.0.0.1" FROM mytable ORDER BY time LIMIT 3; > > Tak jak napisalem wczesniej, to zapytanie nie ma zadnego sensu, poniewaz > z tego co moge zaobserwowac i jak podpowiada mi logika, najpierw wybierze > mi pola z tym numerem ip, a dopiero taki juz otrzymany set, posortuje > wedlug daty. Ja chcialbym na odwrot. Tzn. chce sprawdzic czy w np.100 > ostatnio dodanych rekordach znajduje sie taki a taki numer IP. Czyli > wedlug mnie, powinienem wybrac 100 ostatnio dodanych rekordow > (posortowane wedlug daty), i majac taki juz wynik sprawdzic czy znajduje > sie w nim dany numer IP.
możesz zrobić tak: SELECT (ip) WHERE ip = "127.0.0.1" FROM ( SELECT * FROM mytable ORDER BY time LIMIT 100 ) (nie znam mysql więc nie dam głowy za składnię) Wcześniej pisałeś o ograniczeniu do jednego głosu w miesiącu więc dlaczego nie zrobić tak od razu skoro pole z datą już masz w bazie? Możesz mieć 100 głosów na tydzień, dzień albo minutę.
pozdrawiam A.S.
=?ISO-8859-2?Q?Micha=B3=3FKuratczyk?= - 26-04-2006 01:22
Rep wrote: > Jak rozumiem, sortuje tylko to co jest ustalone przez LIMIT (a nie > wszystko i potem dopiero ogranicza). Jednakze nie potrafie dostrzec jak > moze mi to pomoc w rozwiazac mojego problemu. Najpierw sortuje, a potem wybiera pierwszych N wierszy. Ale jest na tyle sprytny, że widząc iż interesuje Cię tylko pierwszych N, to w miarę możliwości nie sortuje wszystkiego, a jedynie tak długo, aż będzie w stanie zwrócić pierwszych N.
> SELECT (ip) WHERE ip = "127.0.0.1" FROM mytable ORDER BY time LIMIT 3; > > Tak jak napisalem wczesniej, to zapytanie nie ma zadnego sensu, poniewaz z > tego co moge zaobserwowac i jak podpowiada mi logika, najpierw wybierze mi > pola z tym numerem ip, a dopiero taki juz otrzymany set, posortuje wedlug > daty. Ja chcialbym na odwrot. Tzn. chce sprawdzic czy w np.100 ostatnio > dodanych rekordach znajduje sie taki a taki numer IP. Czyli wedlug mnie, > powinienem wybrac 100 ostatnio dodanych rekordow (posortowane wedlug > daty), i majac taki juz wynik sprawdzic czy znajduje sie w nim dany numer > IP. Zrób podzapytanie, tak jak napisał Andrzej. Osobnym zapytaniem wybierasz pierwszych N wierszy (oczywiście podając ORDER BY, bo wybieranie "pierwszych" według losowego porządku jest generalnie bez sensu), a potem zewnętrznym zapytaniem robisz z tym co chcesz (np sprawdzasz czy pojawia się tam dany IP, albo ile razy).
-- Michał Kuratczyk
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 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
zanotowane.pldoc.pisz.plpdf.pisz.plponland.htw.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 |
|