Avatar billede fixxxer Nybegynder
20. september 2004 - 14:46 Der er 10 kommentarer og
1 løsning

tabel sorteringsfejl

Jeg kan se at min tabel's ID-felt (auto_increment) har en forkert rækkefølge, hvilket er rigtig problematisk med min GROUP BY funktion i flere af mine SQL'er.

Det er altså den rækkefølge på rækkerne DATABASEN laver i tabellerne og altså ikke nogen jeg laver med en ORDER BY.

Jeg tror ikke at mine SQL-statements vil gøre nogen gavn her, men hvis i insistere vil jeg smide dem her ind.

Hvad skyldes den forkerte rækkefølge og hvad vigtigere er: hvordan får jeg rettet op på tabellens "indvendige" rækkefølge?

På forhånd tak.
Avatar billede majkat Nybegynder
20. september 2004 - 14:51 #1
Det gør du ikke -- SQL er baseret på sæt-teori, hvor dataene pr. definition er "uordnede".

Hvorfor kan du ikke sætte en ORDER BY ID på din query?
Avatar billede fixxxer Nybegynder
20. september 2004 - 14:52 #2
det prøver jeg også som en sindsyg, lige meget hjælper det :D
Avatar billede majkat Nybegynder
20. september 2004 - 14:59 #3
Lad os se din query...
Avatar billede fixxxer Nybegynder
20. september 2004 - 15:00 #4
SELECT A.threadID, A.threadParent, A.threadForum, A.threadGroup, A.threadTitle, A.threadUser,
A.threadDisplayName, A.threadClicks, A.threadType, A.threadDateTime,
IF(MAX(A.threadDateTime) > A.threadDateTime,
MAX(A.threadDateTime), null) AS MaxOfDate,
IF(MAX(A.threadID) > A.threadID,
MAX(A.threadID), null) AS MaxOfID,
SUM(IF(A.threadParent > 0, 1, 0)) AS threadIndlaeg,
IF((B.trackStamp), 0, 1) AS trackNew,
IF(MAX(A.threadDateTime) > B.trackStamp, 1, 0) AS trackOld
FROM bdal_beboerforum_threads A
LEFT JOIN bdal_beboerforum_tracking B ON B.trackThread = A.threadID AND B.trackUser = 'somename'
WHERE A.threadForum = 4
GROUP BY A.threadGroup
ORDER BY A.threadID, A.threadType DESC, trackNew DESC, trackOld DESC, MaxOfDate DESC, A.threadDateTime DESC
Avatar billede majkat Nybegynder
20. september 2004 - 15:11 #5
OK, jeg har ærligt talt lidt svært ved at overskue den SELECT... :D

Men et gæt: Er det ikke MaxOfID der bør ligge først in din ORDER BY??
Avatar billede fixxxer Nybegynder
20. september 2004 - 15:16 #6
Jeg kan fjerne ORDER BY helt og stadig få et forkert resultat.. altsammen bare fordi at id 40 der hører sammen med id 31 ligger FØR id 31... Det jeg vil returnere med GROUP BY er id 31's værdier, ikke 40 eller 39 eller 38.. Jeg groupere kun pga. mine MAX, SUM og andre GROUP-relerterede funktioner. :D

Hvorfor satan skal den dog gøre sådan en ond ting efter 20+ timers udvikling ?? :>
Avatar billede fixxxer Nybegynder
20. september 2004 - 15:30 #7
Jeg er ved at være desperat :D

Andre forslag??
Avatar billede majkat Nybegynder
20. september 2004 - 15:41 #8
Nope...
Avatar billede arne_v Ekspert
20. september 2004 - 19:50 #9
Er det ikke A.threadGroup du vil lave ORDER BY på ?
Avatar billede arne_v Ekspert
20. september 2004 - 19:52 #10
Er du opmærksom på at hvis der er mere end en værdi for felter du selecter
som ikke er i GROUP BY for hver værdi af de felter der er med i GROUP BY, så
bliver resultatet helt "tilfældigt" ?
Avatar billede fixxxer Nybegynder
20. september 2004 - 20:15 #11
Nej det var jeg vist ikke klar over, men løsningen blev at lave en LEFT JOIN på tabellen:

LEFT JOIN bdal_beboerforum_threads C ON C.threadParent = A.threadID

og så afgrænse WHERE til i principet kun at være een række, hvilket gør GROUP BY overflødelig... den er der dog stadig væk af bekvemhedsårsager pga. MAX, SUM etc. og det er med dets eget ID

Tak for jeres interesse.
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