[SQL] Random row

Pagina: 1
Acties:

  • Nibble
  • Registratie: Juli 2001
  • Laatst online: 31-08 12:10
Hetvolgende:
Ik heb een db, met een stel rows waaronder een stel met verwijzingen naar wallpapers. ik wil een random wallpaper uitkiezen, en ik wil het SNEL (vandaar puur sql).
Ik heb al het een en ander opgezocht op de site van mysql (nieuwste versie), maar veel verder dan dit:
code:
1
2
3
SELECT * FROM tblgoodies
WHERE goodietypeid = 1 AND 
goodieid=(RAND(SELECT COUNT(*) FROM tblgoodies))

kom ik niet. het goodietypeid verwijst gewoon naar dat het een wallpaper is. Ik wil uit de resterende records eerst een count erop maken, en vervolgens hier een random tussenuit pikken, maar sql pikt het niet.

Waarom mede sql-ers?, en wie heeft er een query die wel werkt ? of kan mij vertellen wat ik fout doe. :?

T is for TANK, and T is for TERROR ... and K is the K for KILLING in error.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Ik zou ook wel benieuwd zijn naar een manier om een random record direct via een query eruit te krijgen.

Ik weet niet direct wat hier fout is maar bedenkt wel dat je nu impliceert dat alle goodieid's opeenvolgend moeten zijn. Er mogen geen gaten in zitten. Het lijkt me dat je weleens een wallpaper verwijdert en dan zit je dus wel met een gat.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Kan makkelijker :)
Mysql:
code:
1
2
3
4
5
6
7
8
SELECT 
  * 
FROM 
  tblgoodies 
WHERE 
  goodietypeid=1 
ORDER BY RAND() 
LIMIT 1

MSSQL
code:
1
2
3
4
5
6
7
SELECT TOP 1
  * 
FROM 
  tblgoodies 
WHERE 
  goodietypeid=1 
ORDER BY RAND()

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Dan neem je toch ">= rand (count..."
met een limit van 1

Heb je geen last meer van gaten.

Who is John Galt?


  • Nibble
  • Registratie: Juli 2001
  • Laatst online: 31-08 12:10
Op donderdag 25 juli 2002 21:17 schreef justmental het volgende:
Dan neem je toch ">= rand (count..."
met een limit van 1

Heb je geen last meer van gaten.
zou je dat voor mij in een query kunnen gieten :P ?

T is for TANK, and T is for TERROR ... and K is the K for KILLING in error.


Verwijderd

Op donderdag 25 juli 2002 21:17 schreef Janoz het volgende:
Kan makkelijker :)
MSSQL
code:
1
2
3
4
5
6
7
SELECT TOP 1
  * 
FROM 
  tblgoodies 
WHERE 
  goodietypeid=1 
ORDER BY RAND()
Leuk alleen de random functie in mssql leverd random oplopende getallen op..
code:
1
2
3
SELECT top 1 * 
from tblgoodies o 
ORDER BY RAND( ( @@IDLE % O.IDENTITYCOL ) + DATEPART( ms , CURRENT_TIMESTAMP ) + O.IDENTITYCOL)

Voor 'n betere random regel.

  • Nibble
  • Registratie: Juli 2001
  • Laatst online: 31-08 12:10
Op vrijdag 26 juli 2002 00:43 schreef Yarvieh het volgende:

[..]

Leuk alleen de random functie in mssql leverd random oplopende getallen op..
SELECT top 1 *
from tblgoodies o
ORDER BY RAND( ( @@IDLE % O.IDENTITYCOL ) + DATEPART( ms , CURRENT_TIMESTAMP ) + O.IDENTITYCOL)
Voor 'n betere random regel.
Thanks.
Maar ik denk toch dat ik bij die vorige blijf, dit kost meer processingtijd voor een simpele randomizer ;)
ben er inmiddels uit en het werkt allemaal.
thanks iedereen.

T is for TANK, and T is for TERROR ... and K is the K for KILLING in error.


  • smoove
  • Registratie: Juli 2000
  • Laatst online: 18-06 21:01
zo doe ik het in MS SQL2000

Select top 1 From tabel Order by NewID()

8-)

---


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Op donderdag 25 juli 2002 21:12 schreef Nibble het volgende:
code:
1
2
3
SELECT * FROM tblgoodies
WHERE goodietypeid = 1 AND 
goodieid=(RAND(SELECT COUNT(*) FROM tblgoodies))
Naast de geboden oplossingen wil ik je ook nog wel ff vertellen wat je fout doet: het randomnummer dat je genereert is niet persé een goodietypeid 1. Stel dat alle oneven IDs wallpapers zijn, en je hebt tien entries, dan kan deze RAND bijvoorbeeld 6 opleveren, en dan returned 'ie niks :)

Voor een random wallpaper, rather than een random entry, gebruik je dus bijvoorbeeld
code:
1
2
3
4
SELECT goodieid FROM tblgoodies
WHERE goodietypeid = 1 
LIMIT (RAND(SELECT COUNT(*) FROM tblgoodies WHERE goodietypeid = 1))
ORDER BY goodieid DESC

...en dan alleen de eerste rij gebruiken; let op de extra WHERE :) Let op, deze query laat de blobs ongemoeid, en stelt alleen tussentabellen met de id's op! Op die manier wordt de query imo een stuk efficienter. Als ik aan mag nemen dat je dit met php of asp verwerkt, pleur je dat id in een variabele en query je vervolgens het wallpaper uit de tabel.


Journalism is printing what someone else does not want printed; everything else is public relations.

Pagina: 1