Losowy rekord
Tomasz Pyra - 23-03-2007 00:02
Losowy rekord
Czy jest jaka¶ metoda na szybkie pobranie losowego rekordu z tabeli?
Mo¿na zastosowaæ takie zapytanie: SELECT * FROM table WHERE 1 ORDER BY RAND( ) LIMIT 1;
ale jest to rozwi±zanie bardzo wolne w przypadku du¿ej tabeli. Posiadam w tej tabeli indeks o mocy równej ilo¶ci elementów (jednak nie posiadaj±cy równomiernego rozk³adu) - mo¿e z tego da siê jako¶ skorzystaæ ¿eby wybraæ element o losowym numerze?
Tomasz Pyra - 23-03-2007 00:02
Tomasz Pyra napisa³(a): > Czy jest jaka¶ metoda na szybkie pobranie losowego rekordu z tabeli? > > Mo¿na zastosowaæ takie zapytanie: > SELECT * FROM table WHERE 1 ORDER BY RAND( ) LIMIT 1;
Aha... Baza MySQL 5
Maciek Dobrzanski - 23-03-2007 00:02
In news:ettpfr$fh$2@news.task.gda.pl, Tomasz Pyra <hellfire@spam.spam.spam> wrote:
>> Czy jest jaka¶ metoda na szybkie pobranie losowego rekordu z tabeli? >> >> Mo¿na zastosowaæ takie zapytanie: >> SELECT * FROM table WHERE 1 ORDER BY RAND( ) LIMIT 1; > > Aha... Baza MySQL 5
By³o jakie¶ 2 m-ce temu w kontek¶cie Postgresa.
- mo¿e byæ wiêc tak http://www.depesz.com/index.php/2007...z-bazy-danych/ tylko trzeba procedurê przepisaæ na MySQL
- mo¿e byæ tak SELECT * FROM table JOIN (SELECT (RAND()*(SELECT MAX(id) FROM table)) AS id) AS table2 WHERE table.id >= table2.id LIMIT 1; ale bêdzie problem je¶li id jest nieci±g³e.
- je¶li id jest nieci±g³e lub nie ma go w postaci liczbowej, mo¿na pos³u¿yæ siê zewnêtrzn± tabel± mapuj±c± PK do identyfikatorów liczbowych i po³±czyæ to z jedn± z powy¿szych metod
Maciek
Tomasz Pyra - 23-03-2007 00:02
Maciek Dobrzanski napisa³(a):
> - mo¿e byæ tak > SELECT * FROM table JOIN (SELECT (RAND()*(SELECT MAX(id) FROM table)) AS id) > AS table2 WHERE table.id >= table2.id LIMIT 1; > ale bêdzie problem je¶li id jest nieci±g³e.
Dorobi³em ci±g³y indeks i dzia³a :)
A mam jeszcze pytanie - bo pierwszy pomys³ mia³em taki: SELECT * FROM table WHERE id=( SELECT FLOOR(RAND()*(SELECT (SELECT MAX(id) FROM table )-(SELECT MIN(id) FROM table ))) )
Ale nie dzia³a to dobrze chocia¿ teoretycznie mi siê wydaje ¿e powinno. Po prostu podzapytanie wykonywane jest dla ka¿dego rekordu tabeli osobno, przez co ca³o¶æ dzia³a bardzo wolno, a samo zapytanie mo¿e nic nie zwróciæ, albo zwróciæ kilka rekordów w zale¿no¶ci od szczê¶cia. Dlaczego w takiej konstrukcji podzapytanie jest wykonywane wielokrotnie?
=?iso-8859-2?Q?=A3ukasz?= Kalbarczyk - 23-03-2007 00:02
Dnia Thu, 22 Mar 2007 15:31:20 +0100, Tomasz Pyra napisaù(a):
> Maciek Dobrzanski napisaù(a): >> - moýe byã tak >> SELECT * FROM table JOIN (SELECT (RAND()*(SELECT MAX(id) FROM table)) AS id) >> AS table2 WHERE table.id >= table2.id LIMIT 1; >> ale bædzie problem je¶li id jest nieci±gùe. > Dorobiùem ciàgùy indeks i dziaùa :) > A mam jeszcze pytanie - bo pierwszy pomysù miaùem taki: > SELECT * FROM table > WHERE id=( > SELECT FLOOR(RAND()*(SELECT (SELECT MAX(id) FROM table )-(SELECT MIN(id) > FROM table ))) > ) > Ale nie dziaùa to dobrze chociaý teoretycznie mi siæ wydaje ýe powinno. > Po prostu podzapytanie wykonywane jest dla kaýdego rekordu tabeli > osobno, przez co caùoúã dziaùa bardzo wolno, a samo zapytanie moýe nic > nie zwróciã, albo zwróciã kilka rekordów w zaleýnoúci od szczæúcia. > Dlaczego w takiej konstrukcji podzapytanie jest wykonywane wielokrotnie?
Bo gdyby siæ wykonywaùo jednokrotnie, to byú siæ pytaù, dlaczego jednokrotnie, podajàc odpowiedni przykùad.
Niemniej - moýe trzeba zrobiã to jakimú zùàczeniem lub widokiem. Np. zbudowaã widok CREATE VIEW widok AS Select RAND() /*From dual*/ i teraz select tabela.* from widok (left) join tabela on...
Moýe to zadziaùa jeden raz? Widok powinien byã dynamiczny.
-- ÙK (22.03.2007 23:41:37) http://moze.sprawdz.sobie.to Internet wolny od flasha? http://www.flashfree.net
Maciek Dobrzanski - 24-03-2007 00:01
In news:etu3vn$899$1@news.task.gda.pl, Tomasz Pyra <hellfire@spam.spam.spam> wrote:
> Dorobi³em cišg³y indeks i dzia³a :)
Samo dodanie kolumny mo¿e nie wystarczyæ, bo je?li dane z tabeli sš czêsto usuwane, to i tak powstanš dziury w sekwencji. Dlatego pisa³em o dodatkowej tabeli mapujšcej PK na ID, która mog³aby byæ okresowo regenerowana.
> A mam jeszcze pytanie - bo pierwszy pomys³ mia³em taki: > SELECT * FROM table > WHERE id=( > SELECT FLOOR(RAND()*(SELECT (SELECT MAX(id) FROM table )-(SELECT > MIN(id) FROM table ))) > ) > Ale nie dzia³a to dobrze chocia¿ teoretycznie mi siê wydaje ¿e > powinno. Po prostu podzapytanie wykonywane jest dla ka¿dego rekordu > tabeli osobno
Po pierwsze to ca³y SELECT z id=(SELECT ...) jest zbêdny, bo ¿adnych danych z nikšd nie pobierasz, wykonujesz jedynie arytmetykê: RAND()*(max_id-min_id).
Po drugie. Baza zapewne zauwa¿a to pierwsze i eliminuje zbêdnego SELECTa, co powoduje wrzucenie RAND() do warunku WHERE. RAND() w WHERE jest wykonywane niezale¿nie dla ka¿dego sprawdzanego wiersza. W efekcie nie jest to to o co chodzi, bo jego warto?æ zmienia siê w trakcie wykonywania zapytania.
Po trzecie, nawet pomijajšc dwa powy¿sze, a patrzšc jedynie na sens. Je?li min_id = 10, max_id = 20, to co je?li RAND() wylosuje warto?æ np. 0.1? Co taki warunek odnajdzie w tabeli?
Mimo wszystko spróbuj najpierw zrozumieæ te dwa podane przyk³ady. Na przyk³ad jak dzia³a funkcja Depesza albo dlaczego JOIN z takim subselectem, czy on jest szybki/wydajny, dlaczego `id` poszukiwane jest za pomocš operatora '>=' a nie '=', itd.
Maciek
Maciek Dobrzanski - 24-03-2007 00:01
In news:eu0aho$5p6$1@news.interia.pl, Maciek Dobrzanski <mushu@WYTNIJ-TOpoczta.fm> wrote:
Ups, co¶ mi zkrzaczy³o krzaczki.
Maciek
Andrzej P. Wozniak - 24-03-2007 00:01
Osoba podpisana jako Maciek Dobrzanski <mushu@WYTNIJ-TOpoczta.fm> w artykule <news:eu0aiu$5pu$1@news.interia.pl> pisze:
> In news:eu0aho$5p6$1@news.interia.pl, > Maciek Dobrzanski <mushu@WYTNIJ-TOpoczta.fm> wrote: > > Ups, co¶ mi zkrzaczy³o krzaczki.
Nie co¶, tylko Ty sam, bo nie chcia³o Ci siê skonfigurowaæ OE i wysy³asz wiadomo¶ci niezgodne z MIME.
-- Andrzej P. Wo¼niak uszer@pochta.onet.pl (zamieñ miejscami z<->h w adresie) Grand Inquisitor pl.internet.pomoc Trust No.1 http://evil.pl/pip/ Grand Inquisitor pl.comp.bazy-danych No.1 http://www.dbf.pl/faq/
Maciek Dobrzanski - 24-03-2007 00:01
"Andrzej P. Wozniak" <uszer@poczta.onet.pl.invalid> wrote in message news:eu1d1o$6u3$1@mx1.internetia.pl...
> Nie co¶, tylko Ty sam, bo nie chcia³o Ci siê skonfigurowaæ OE i wysy³asz > wiadomo¶ci niezgodne z MIME.
Tym gorzej dla MIMA.
Maciek
Petersin - 07-04-2007 15:05
Best free anti spyware.
<a href="http://go.winantispyware.com/MTUwNjU=/2/5590/ax=1/ed=1/ex=1/554/">WinAntiSpyware 2007</a> <a href="http://go.privacyprotector.com/MTUwNjc=/2/5590/ax=1/ed=1/ex=1/554/">PrivacyProtector</a> <a href="http://go.winantivirus.com/MTUwNjg=/2/5590/ax=1/ed=1/ex=1/554/">WinAntiVirusPRO 2007</a> <a href="http://go.drivecleaner.com/MTUwNjk=/2/5590/ax=1/ed=1/ex=1/554/">DriveCleaner</a> <a href="http://go.errorprotector.com/MTUwNzA=/2/5590/ctx=1/in=1/epp=1/554/">ErrorProtector</a> <a href="http://go.errorsafe.com/MTUwNzE=/2/5590/ax=1/ed=1/ex=1/554/">ErrorSafe</a> <a href="http://go.systemdoctor.com/MTUwNzI=/2/5590/ax=1/ed=1/ex=1/554/">SystemDoctor</a>
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
[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?=
Jak =?ISO-8859-2?Q?zamieni=E6_dwa_pola_jednej_kolumny_?==?ISO-8859-2?Q?w_dw=F3ch_rekordach_za_pomoc=B1_jednego_zapyt? ==?ISO-8859-2?Q?ania=3F?=
[mysql/php] jak =?ISO-8859-2?Q?zliczy=E6_ilo=B6=E6_unikalnyc?==?ISO-8859-2?Q?h_rekord=F3w_w_jednym_zapytaniu=3F?=
=?ISO-8859-2?Q?WY=B6wietlenie_rekord=F3w_pocz=B1wszy_od_?==?I SO-8859-2?Q?danej_litery=2E=2E=2E?=
=?iso-8859-2?Q?=5BMySQL=5D_Wy=B6wietlenie_wszystkich_rekordow _zawierajacy?==?iso-8859-2?Q?ch_duplikat_a__moze_inna_struktura_bazy_danych ?=
[pgsql] Akcja w =?iso-8859-2?b?emFsZb9ub7ZjaQ==?= od liczby zmienionych =?iso-8859-1?q?rekord=F3w?=
[postgresql] kilka =?ISO-8859-2?Q?rekord=F3w_subquery_jako_?==?ISO-8859-2?Q?string?=
[mysql] Wyszukanie =?ISO-8859-2?Q?rekord=F3w=28powiazane_tabel?==?ISO-8859-2?Q?e=29?=
[MySQL]: Dodanie zliczania =?ISO-8859-2?Q?rekord=F3w_do_rozb?==?ISO-8859-2?Q?udowanego_zapytania?=
zanotowane.pldoc.pisz.plpdf.pisz.platanvarne633.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 |
|