/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Random id
Fra : Sinkbæk


Dato : 13-01-02 17:31

Hej!

Hvordan finder jeg en random row i min mysql database? Jeg har to felter: id
og tekst.

Mvh.
-Sinkbæk



 
 
Mads Lie Jensen (13-01-2002)
Kommentar
Fra : Mads Lie Jensen


Dato : 13-01-02 17:37

On Sun, 13 Jan 2002 17:30:38 +0100, "Sinkbæk" <ts@88888nvr.dk> wrote:

>Hvordan finder jeg en random row i min mysql database? Jeg har to felter: id
>og tekst.

select * from tabel order by rand() limit 1;

- hvis altså du bruger mindst mysql 3.23

--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk

Directory Opus - nu også til windows - http://www.gpsoft.com.au

Svenne Krap (13-01-2002)
Kommentar
Fra : Svenne Krap


Dato : 13-01-02 19:17

On Sun, 13 Jan 2002 17:36:45 +0100, Mads Lie Jensen
<mads@gartneriet.dk> wrote:

>select * from tabel order by rand() limit 1;
>- hvis altså du bruger mindst mysql 3.23

Av for en kedelig performance...

bedre :

select max(id) from tabel

og i dit script/program vælge et tilfældigt tal (eller flere) i
intervallet 1 - max(id)


derpå laver du (efter om du har en eller flere)

select * from tabel where id = '$id'

eller select * from tabel where id in (id1, id2, ...) limit 1

Det gør ikke nær så ondt som at skulle sortere en tabel vilkårligt ..


Svenne
--
Mail usenet@krap.dk - svenne@krap.dk - PGP key id : 0xDF484022
ICQ: 5434480 - http://www.krap.dk - http://www.krap.net
PGP Key http://keys.pgp.dk:11371/pks/lookup?op=get&search=0xDF484022

Niels Andersen (13-01-2002)
Kommentar
Fra : Niels Andersen


Dato : 13-01-02 20:50

"Svenne Krap" <usenet@krap.dk> wrote in message
news:olj34uo1q1fno6oogv2i92flimdo956vjs@4ax.com...
> select max(id) from tabel
> og i dit script/program vælge et tilfældigt tal (eller flere) i
> intervallet 1 - max(id)

Forudsætter det ikke, at *alle* id'er mellem 1 og max(id) findes, og at alle
rækker der findes er brugbare?

--
Mvh.

Niels Andersen



Svenne Krap (13-01-2002)
Kommentar
Fra : Svenne Krap


Dato : 13-01-02 21:23

On Sun, 13 Jan 2002 20:49:40 +0100, "Niels Andersen"
<niels-usenet@myplace.dk> wrote:

>"Svenne Krap" <usenet@krap.dk> wrote in message
>news:olj34uo1q1fno6oogv2i92flimdo956vjs@4ax.com...
>> select max(id) from tabel
>> og i dit script/program vælge et tilfældigt tal (eller flere) i
>> intervallet 1 - max(id)
>
>Forudsætter det ikke, at *alle* id'er mellem 1 og max(id) findes, og at alle
>rækker der findes er brugbare?

Jope, det var netop derfor jeg snakkede om flere id'er du selecter den
første ud fra..

Derved rammer man med større sikkerhed et gyldigt tal .. og ellers
prøver man bare igen..

Order by rand() bør være absolut sidste udvej.

Svenne
--
Mail usenet@krap.dk - svenne@krap.dk - PGP key id : 0xDF484022
ICQ: 5434480 - http://www.krap.dk - http://www.krap.net
PGP Key http://keys.pgp.dk:11371/pks/lookup?op=get&search=0xDF484022

Mads Lie Jensen (13-01-2002)
Kommentar
Fra : Mads Lie Jensen


Dato : 13-01-02 21:02

On Sun, 13 Jan 2002 19:17:13 +0100, Svenne Krap <usenet@krap.dk>
wrote:

>>select * from tabel order by rand() limit 1;
>>- hvis altså du bruger mindst mysql 3.23
>
>Av for en kedelig performance...

Nåja.. jeg quoter bare manualen...
Bliver det forøvrigt værre end hvis man sorterer efter en kolonne uden
index?
F.eks ens tabel har felterne 'id' og 'tilfældigttal' og hvor man
indsætter rækker med:

INSERT INTO tabel (tilfældigttal) VALUES (rand());

og der altså ikke er noget index på tilfældigttal

>bedre :
>
>select max(id) from tabel
>
>og i dit script/program vælge et tilfældigt tal (eller flere) i
>intervallet 1 - max(id)
>
>
>derpå laver du (efter om du har en eller flere)
>
>select * from tabel where id = '$id'
>
>eller select * from tabel where id in (id1, id2, ...) limit 1
>
>Det gør ikke nær så ondt som at skulle sortere en tabel vilkårligt ..

Men hvad gør man så hvis noget henad hver anden post er blevet
slettet? (Her går jeg så ud fra at 'id' bliver genereret med mysqls
auto_increment, som jeg ikke (længere) genbruger numrene)

--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk

Directory Opus - nu også til windows - http://www.gpsoft.com.au

Svenne Krap (13-01-2002)
Kommentar
Fra : Svenne Krap


Dato : 13-01-02 21:24

On Sun, 13 Jan 2002 21:01:56 +0100, Mads Lie Jensen
<mads@gartneriet.dk> wrote:

>Men hvad gør man så hvis noget henad hver anden post er blevet
>slettet? (Her går jeg så ud fra at 'id' bliver genereret med mysqls
>auto_increment, som jeg ikke (længere) genbruger numrene)

Bruger du ikke auto_increment ? fortæl, fortæl :)
Hvordan slipper man af med det misfoster ?

Jeg er selv begyndt at kode MySQL igen efter godt to års pause og en
af de største irritationsmomenter er auto_increment og mangel på
subselects... :)

Svenne
--
Mail usenet@krap.dk - svenne@krap.dk - PGP key id : 0xDF484022
ICQ: 5434480 - http://www.krap.dk - http://www.krap.net
PGP Key http://keys.pgp.dk:11371/pks/lookup?op=get&search=0xDF484022

Mads Lie Jensen (13-01-2002)
Kommentar
Fra : Mads Lie Jensen


Dato : 13-01-02 21:43

On Sun, 13 Jan 2002 21:24:00 +0100, Svenne Krap <usenet@krap.dk>
wrote:

>>Men hvad gør man så hvis noget henad hver anden post er blevet
>>slettet? (Her går jeg så ud fra at 'id' bliver genereret med mysqls
>>auto_increment, som jeg ikke (længere) genbruger numrene)
>
>Bruger du ikke auto_increment ? fortæl, fortæl :)

en tastefejl.. fjern det lille 'jeg'.

>Hvordan slipper man af med det misfoster ?

Hvorfor mener du den er et misfoster? Den er da ikke anderledes end at
bruge en sequence til at give en unik fortløbende værdi, som man f.eks
gør i postgreSQL.

Jeg har testet lidt...
En tabel:
CREATE TABLE lots (
id int(11) NOT NULL auto_increment,
test char(35),
PRIMARY KEY (id)
);

blev fyldt med 110.000 tilfældige md5-hashes lavet med phps
md5(rand(0,9999999))

En
SELECT * FROM lots ORDER BY rand() LIMIT 1;
tager i omegnen af 2,2 sekunder.

Bruger man
SELECT *, rand() AS o FROM lots ORDER BY o LIMIT 1;
tager også i omegnen af 2,2 sekunder.

Mens en
SELECT * FROM lots ORDER BY test LIMIT 1;
kun tager i omegnen af 1,5 sekunder.
Selvom test også indeholder en tilfældig værdi som skal sorteres. Det
kan være det er selve kaldet af rand()-funktionen der tager den ekstra
tid, det vil jeg tro det er...

En
SELECT * FROM lots ORDER BY REVERSE(test) LIMIT 1;
tager ca. 2,75 sekunder, så at 110.000 kald til rand() tager ca 0,7
sekunder er vel ikke helt af vejen...

Sætter jeg så et index på 'test', og kører igen en
SELECT * FROM lots ORDER BY test LIMIT 1;
ja, så er det jo en helt anden snak.. nu tager det 0,01 sekund.

Det at lave en ORDER BY rand() er så vel ikke meget mere kraftsugende
end at sortere efter et hvilket som helst andet felt uden et index
på...

>Jeg er selv begyndt at kode MySQL igen efter godt to års pause og en
>af de største irritationsmomenter er auto_increment og mangel på
>subselects... :)

Jeg bruger lige for tiden postgreSQL men har stadig ikke haft brug for
subselects... men det er også kun webfnidder jeg leger med

--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk

Directory Opus - nu også til windows - http://www.gpsoft.com.au

Svenne Krap (13-01-2002)
Kommentar
Fra : Svenne Krap


Dato : 13-01-02 22:01

On Sun, 13 Jan 2002 21:43:11 +0100, Mads Lie Jensen
<mads@gartneriet.dk> wrote:


>Hvorfor mener du den er et misfoster? Den er da ikke anderledes end at
>bruge en sequence til at give en unik fortløbende værdi, som man f.eks
>gør i postgreSQL.

Det er et misfoster fordi det smadrer klassisk database teori, at
sequences ikke findes "rigtigt".

Det er bl.a. meget smart at kunne selecte fra sequencen og så bruge
den værdi explicit. Eksempler vil være for store til at vise her.

Men det kan koges ned til at nogle gange (ikke altid er dette
argumentet for at bruge seqences i stedet for auto_increment) er det
nødvendigt at "sikre pladsen" inden man kender dataene. Dette gælder
hvis rækkefølgen af data er essentiel samt beregningstiden for
linjerne kan variere kraftigt.

Jeg kan også forstille mig, at auto_increment ikke er sjov sammen med
heftig brug af transactions.. nu er det ikke std. mysql feature, så
pyt :)

>Jeg bruger lige for tiden postgreSQL men har stadig ikke haft brug for
>subselects... men det er også kun webfnidder jeg leger med

Det er fordi du ikke er vant til at tænke i subselects... jeg laver
også kun webfnadder, men subselects er dagligdags helt i stil med
almindelige selects...

Det er rigtigt, at mange subselects kan erstattes af joins, men det er
ikke altid smart. (om ikke andet er subselects tit meget lettere at
læse hvad gør)

Svenne
--
Mail usenet@krap.dk - svenne@krap.dk - PGP key id : 0xDF484022
ICQ: 5434480 - http://www.krap.dk - http://www.krap.net
PGP Key http://keys.pgp.dk:11371/pks/lookup?op=get&search=0xDF484022

Svenne Krap (13-01-2002)
Kommentar
Fra : Svenne Krap


Dato : 13-01-02 21:25

On Sun, 13 Jan 2002 19:17:13 +0100, Svenne Krap <usenet@krap.dk>
wrote:

>On Sun, 13 Jan 2002 17:36:45 +0100, Mads Lie Jensen
><mads@gartneriet.dk> wrote:
>
>>select * from tabel order by rand() limit 1;
>>- hvis altså du bruger mindst mysql 3.23
>
>Av for en kedelig performance...

[snip gammel løsning]

Svenne, du er en gammel dør.

det skulle selv have været


select count(*) from tabel

vælg eet tilfældigt tal mellem 1 og count(*)-1 lad os kalde det for
$row.

select * from tabel limit 1,$row (kan ikke huske, om de skal vende
således)

Svenne
--
Mail usenet@krap.dk - svenne@krap.dk - PGP key id : 0xDF484022
ICQ: 5434480 - http://www.krap.dk - http://www.krap.net
PGP Key http://keys.pgp.dk:11371/pks/lookup?op=get&search=0xDF484022

Niels Andersen (13-01-2002)
Kommentar
Fra : Niels Andersen


Dato : 13-01-02 21:45

"Svenne Krap" <usenet@krap.dk> wrote in message
news:27r34ug8f4atas4igd3ekprpef10l9g356@4ax.com...
> select count(*) from tabel
> vælg eet tilfældigt tal mellem 1 og count(*)-1 lad os kalde det for
> $row.
> select * from tabel limit 1,$row (kan ikke huske, om de skal vende
> således)

Ah, det var jo straks noget helt andet. :)
Det er egentlig en god ide. :)

(Og jo, din "LIMIT" vender forkert.)

--
Mvh.

Niels Andersen



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste