Toon posts:

[mysql] random query

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hey,

Ik wil met MySQL 5 random rows uit een tabel halen.
Ik heb op dit forum lopen zoeken en overal kom ik uit op de functie rand() in MySQL. Ook in de handleiding vind ik dit terug.

Echter als ik een rand() gebruik in een query statement
code:
1
select * from tblKlanten ORDER BY rand() LIMIT 0, 30

dan krijg ik altijd een foutmelding:
code:
1
You have an error in your SQL syntax near 'rand() LIMIT 0, 30' at line 1



Ik gebruik MySQL versie 3.22.32

Iemand enig idee?!

Ik wil het perse vanuit de query doen en niet vanuit PHP, omdat het een database is met ongeveer 100.000 records.

[ Voor 3% gewijzigd door Verwijderd op 21-03-2003 11:39 ]


Verwijderd

De functie rand wordt dacht ik pas ondersteund vanaf mysql versie 3.23

check Mysql site

Verwijderd

code:
1
SELECT * FROM `table` WHERE `id`=ROUND(RAND() * COUNT(`id`)) LIMIT 5


ik zit hier aan te denken (weet niet of het werkt, kijk maar even)

Verwijderd

RAND(N)
Returns a random floating-point value in the range 0 to 1.0. If an integer argument N is specified, it is used as the seed value:
code:
1
2
3
4
5
6
7
8
9
10
mysql> SELECT RAND();
        -> 0.9233482386203
mysql> SELECT RAND(20);
        -> 0.15888261251047
mysql> SELECT RAND(20);
        -> 0.15888261251047
mysql> SELECT RAND();
        -> 0.63553050033332
mysql> SELECT RAND();
        -> 0.70100469486881


You can't use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times. In MySQL Version 3.23, you can, however, do: SELECT * FROM table_name ORDER BY RAND() This is useful to get a random sample of a set SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000. Note that a RAND() in a WHERE clause will be re-evaluated every time the WHERE is executed. RAND() is not meant to be a perfect random generator, but instead a fast way to generate ad hoc random numbers that will be portable between platforms for the same MySQL version.


jij gebruik versie 3.22 en je moet 3.23 hebben

[ Voor 5% gewijzigd door Verwijderd op 21-03-2003 11:45 ]


Verwijderd

Topicstarter
ehm, ik zie nu dat als ik

select rand(id) as orderKey, * from tblKlanten ORDER BY orderKey LIMIT 0,5

dat het wel werkt.

Alleen krijg ik dan steeds dezelfde resultaten.
Nu alleen dat nog oplossen.

Verwijderd

Topicstarter
SELECT * FROM tblKlanten WHERE
lng_KlantID=ROUND(RAND() * COUNT(lng_KlantID)) LIMIT 5

krijg ik de melding:
Invalid use of group function

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

het staat er toch heel duidelijk:
You can't use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

ehm, ik zie nu dat als ik

select rand(id) as orderKey, * from tblKlanten ORDER BY orderKey LIMIT 0,5

dat het wel werkt.

Alleen krijg ik dan steeds dezelfde resultaten.
Nu alleen dat nog oplossen.
Ja, zoals PHProgrammer al zei:
RAND(N)
Returns a random floating-point value in the range 0 to 1.0. If an integer argument N is specified, it is used as the seed value:
Aangezien id voor elk record hetzelfde is zal rand(id) ook voor elk record hetzelfde "random" getal genereren en dus zal "ORDER BY orderKey" altijd in dezelfde volgorde sorteren.

[ Voor 8% gewijzigd door Verwijderd op 21-03-2003 12:17 ]


Verwijderd

Topicstarter
eh ja daar heb je gelijk in.

via phpbuilder.com kom ik tot de volgende oplossing die werkt:

SELECT
lng_KlantID, lng_KlantID*0+rand() as random
FROM tblKlanten
ORDER BY random
LIMIT 5

Verwijderd

Verwijderd schreef op 21 March 2003 @ 12:15:
lng_KlantID*0+rand() as random
ehm....
hier komt toch ook gewoon Rand() uit ??
want iets keer 0 is 0 plus de random value = random value

[ Voor 4% gewijzigd door Verwijderd op 21-03-2003 13:33 ]


Verwijderd

Topicstarter
tsja, op de 1 of andere manier werkt ie zo wel ... een workaround voorlopig ... is niet zo netjes, maarja

en raar of niet:

zoals hierboven komt er elke keer een andere uitkomst uit.
Als ik alleen rand() as random doe komen er steeds dezelfde waarden uit.

[ Voor 43% gewijzigd door Verwijderd op 21-03-2003 13:35 ]

Pagina: 1