Avatar billede kimlarsen1978 Nybegynder
02. marts 2008 - 08:34 Der er 11 kommentarer

Tilfældigudvælgelse med ekstra betingelse

Hejsa
Jeg har en tabel med hvor det samme bruger-id kan have flere entries. Jeg vil gerne udvælge 7 helt tilfældige poster fra den tabel, men det samme bruger-id må ikke udvælges mere end én gang.

Sådan lidt i dymmy kode vil det nok se sådan her ud:

SELECT * FROM tabel WHERE <betingelserne er opfyldt> ORDER BY RAND() LIMIT 0,5"

Men hvordan bygger jeg den betingelse med at samme bruger-id ikke må optræde mere end én gang?
Avatar billede kimlarsen1978 Nybegynder
02. marts 2008 - 08:35 #1
hehe - det er selvfølgelig LIMIT 0,7 :-)
Avatar billede nielle Nybegynder
02. marts 2008 - 08:47 #2
Ja, så behøver du ikke at gøre mere.

Den kommer allerede kun en gang - med mindre at det samme bruger-id optræder flere gange i tabellen.
Avatar billede kimlarsen1978 Nybegynder
02. marts 2008 - 08:55 #3
Det er jo det der er problemet ;-)
"Jeg har en tabel hvor det samme bruger-id kan have flere entries."
Avatar billede nielle Nybegynder
02. marts 2008 - 09:04 #4
Prøv med distinct:

SELECT * FROM
(
SELECT DISTINCT id FROM dinTabel
)
ORDER BY rand()
LIMIT 0,7
Avatar billede nielle Nybegynder
02. marts 2008 - 09:07 #5
... eller:

SELECT * FROM
WHERE id IN
(
SELECT DISTINCT id FROM dinTabel
)
ORDER BY rand()
LIMIT 0,7
Avatar billede kimlarsen1978 Nybegynder
02. marts 2008 - 09:25 #6
Det ser ud til at virke, men lige et spørgsmål:

Hvis nu et id er repræsenteret 10 gange oftere end end et andet, vil det så med brugen at DISTINCT have 10 gange større sandsynlighed for at blive valgt?

Jeg havde nemlig startet med GROUP BY, men så havde alle lige stor sandsynlighed for at blive valgt, og det ønsker jeg ikke.
Avatar billede nielle Nybegynder
02. marts 2008 - 09:54 #7
Det tror jeg ikke.

Har rækkerne et unikt id (altså noget andet end bruger id),
Avatar billede kimlarsen1978 Nybegynder
02. marts 2008 - 10:56 #8
Yes - kolonnen ID er unik
Avatar billede kimlarsen1978 Nybegynder
02. marts 2008 - 22:52 #9
Hej igen
Jeg har løst problemet på den "dumme" måde. Jeg selecter alt også tjekker jeg i loopet om den den er ved har været der:

do until x > 7
'Tjek om det er en NY
aktuelUserID = rs("brugerID")
if inStr(1, strUserIDs, aktuelUserID) = 0 then
  'Opdater str med ny ID
  strUserIDs = strUserIDs & aktuelUserID & ", "
...

Ikke pænt, men det virker :-)
Jeg vil dog fortsat gerne høre, hvis der er nogle der kender en ren SQL løsning på dette.
Avatar billede nielle Nybegynder
17. marts 2008 - 18:40 #10
Jeg tror det desværre ikke. Det er ikke lige den slags ting SQL er designet til at kunne klaer.
Avatar billede kimlarsen1978 Nybegynder
13. februar 2010 - 19:03 #11
Smid et svar - så lukker jeg
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester