Avatar billede torotune Nybegynder
27. august 2010 - 09:31 Der er 9 kommentarer og
1 løsning

DISTINCT og ORDER BY

Hej,

Jeg har denne SQL-sætning hvor jeg gerne vil sortere udtrækkene tilfældigt. Problemet er at jeg får en fejl om at DISTINCT og ORDER konflikter med hinanden:

SELECT DISTINCT bruger.ID, bruger.Navn, bruger.Adresse, PostnummerTabel.PostNr, PostnummerTabel.By FROM (PostnummerTabel INNER JOIN Bruger ON (PostnummerTabel.Postnr = bruger.PostNr) AND (PostnummerTabel.Postnr = bruger.PostNr)) INNER JOIN Keywords ON bruger.ID = Keywords.brugerID
WHERE (Keywords.Keyword Like '" & strKeyword & "%' OR bruger.Navn Like '" & strKeyword & "%') ORDER BY Rnd(-10000000*TimeValue(Now())*[bruger.ID])

Hvordan kan man komme uden om den? Er det noget med at man kan løse det med GROUP BY?

Mvh.
Avatar billede jensen363 Forsker
27. august 2010 - 09:41 #1
Ved ikke om dette hjælper, men når jeg benytter mig af tilfældige data, eksempelvis til stikprøveudtagelse, benytter jeg denne funktion sammen med Rnd() syntaxen :

Function Randomizer() As Integer
Static AlreadyDone As Integer
        If AlreadyDone = False Then Randomize: AlreadyDone = True
    Randomizer = 0
End Function

Eksempel ( tilfældigt udtræk af 5 stikprøver )

SELECT TOP 5 qryIdentificérLogData_Husejere.[LEVDØR No], qryIdentificérLogData_Husejere.JLDATE, tblDate.Year, tblDate.WeekNo
FROM tblDate INNER JOIN qryIdentificérLogData_Husejere ON tblDate.OriginalDate = qryIdentificérLogData_Husejere.DATE
GROUP BY qryIdentificérLogData_Husejere.[LEVDØR No], qryIdentificérLogData_Husejere.JLDATE, tblDate.Year, tblDate.WeekNo
HAVING (((tblDate.Year)=[Vælg år : ]) AND ((tblDate.WeekNo)=[Vælg uge nr : ]) AND ((randomizer())=0))
ORDER BY Rnd(IsNull(qryIdentificérLogData_Husejere.[LEVDØR No])*0+1);
Avatar billede torotune Nybegynder
27. august 2010 - 09:56 #2
Hej - tak for dit eksempel. Men det er ikke tilfældighedsgeneratoren der er problemet. Det vil heller ikke virke med "ORDER by ID"

Det er kombinationen af DISTINCT og ORDER BY der ikke vil fungere.
Avatar billede jensen363 Forsker
27. august 2010 - 10:01 #3
Ok, så vil en ekstra forespørgsel måske løse det
Avatar billede janus_007 Nybegynder
27. august 2010 - 10:04 #4
ja jo.. det kan man måske også godt forstå den ikke lige vil. Men du kunne fjerne bruger.ID

ORDER BY Rnd(-10000000*TimeValue(Now()))

Det er jo stadigvæk helt random :)
Avatar billede torotune Nybegynder
27. august 2010 - 11:02 #5
Jeg kan godt fjerne ID, men problemet er stadig at ORDER og DISTINCT konflikter:

Fejl:

ORDER BY clause (Rnd(-10000000*TimeValue(Now()))) conflicts with DISTINCT.
27. august 2010 - 14:54 #6
torotune, hvad precis siger fejlmeddelelsen?  Du er vel opmaerksom paa at By er et reserveret ord i adskillige dialekter af SQL?  Der bestaar den mulighed at den konfliktende faktor er at du kalder et felt By.  Du har ogsaa den samme ON klausul to gange "ON (PostnummerTabel.Postnr = bruger.PostNr) AND (PostnummerTabel.Postnr = bruger.PostNr)", men det er vel blot overfloedigt uden at konflikte med noget.

Jeg testede din query i MySql fordi det er hvad jeg har til raadighed.  Jeg oprettede tre tabeller torotune_bruger, torotune_PostNr, og torotune_Keywords.  Jeg var noedt til at erstatte Rnd() med Rand() og TimeValue() med Timestamp().  Med disse rettelser, og ved at jeg kalte feltet "Stad" i stedet for "By" fik jeg denne query til at virke uden konflikter eller fejlmeldinger:

SELECT DISTINCT b.ID, b.Navn, b.Adresse, p.PostNr, p.Stad FROM torotune_PostNr p INNER JOIN torotune_bruger b ON p.Postnr = b.PostNr AND p.Postnr = b.PostNr INNER JOIN torotune_Keywords k ON b.ID = k.brugerID
WHERE k.Keyword Like 'navn3%' OR b.Navn Like 'navn3%'
ORDER BY Rand(-10000000*Timestamp(Now()));
29. august 2010 - 19:32 #7
torotune, fik du mit indlaeg?  Jeg ville vaere glad for en reaktion, isaer at du giver den noejagtige ordlyd paa fejlmeldingen.  Hvis du har haft tid til at teste  det at undgaa det reserverede ord By som feltnavn ville det ogsaa vaere interessant at kende resultatet.
Avatar billede torotune Nybegynder
30. august 2010 - 08:35 #8
Hej igen Christian. Tak for din test der.

Min fejlmeddelelse siger:

ORDER BY-delsætningen (Rnd(-10000000*TimeValue(Now()))) er i konflikt med DISTINCT.

Jeg skal lige kigge lidt ekstra på den SQL-sætning du tester med der.

Mvh.
03. september 2010 - 05:14 #9
torotune, fik du kikket paa det?  Spoergsmaalet er en uge gammelt nu.  Det ville vaere godt enten at faa det konkluderet (lukket, med eller uden points til mig eftersom mit indlaeg viste sig at vaere nyttigt eller ikke) eller at faa dine specifikke reaktioner som man kan arbejde videre med.
Avatar billede torotune Nybegynder
05. september 2010 - 15:39 #10
Hej Christian, jeg fik ikke helt løst problemet, da jeg stadig har en konflikt mellem ORDER og DISTINCT. Men du skal have tak fordi du tog dig tid til at hjælpe og fordi du også testede det og fik det til at virke. Jeg accepterer herfor din hjælp som et svar. Mvh.
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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