ďťż
 
[MySQL]Przeszukiwanie ďťż
 
[MySQL]Przeszukiwanie
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • ponland.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com