"Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> wrote in
message news:3D946129.532B6973@MOVEcgey.com...
> > > > Jeg er igang med et statistiksystem i PHP, hvor jeg har en MySQL
tabel
> > med
> > > > alle mine statistikdata i.
> > > > Der kommer så en ny række for hver sidevisning, indeholdende IP,
> > hostname
> > > > osv.
> > > > Jeg er så igang med at lave et system som kan fremvise statistikken,
> > hvor
> > > > jeg er nået til hvor man har valgt en måned og det så er meningen at
man
> > > > skal kunne se alle dagene for måneden, med navne på dagene, hvor
> > > > weekenddagende skal være fremhævede.
> > > > Det går da også fint nok, hvor jeg bruger en DISTINCT query til at
finde
> > ud
> > > > af hvor mange dage der er i måneden.
> > > > Den ser så sådan ud:
> > > >
> > > > SELECT DISTINCT dag_maaned FROM statistik WHERE maaned='$maaned' AND
> > > > aar='$aar' ORDER BY dag_maaned
> > > >
> > > > Jeg skal jo så også kunne få fat i dagens navn og for ikke at skulle
> > lave
> > > > endnu en query, da det i forvejen går rimelig langsomt, så ville jeg
> > gerne
> > > > have hvis jeg kunne få "dag_uge" ind.
> > > >
> > > > Jeg har så prøvet at lave denne:
> > > >
> > > > SELECT DISTINCT dag_uge, dag_maaned FROM statistik WHERE
> > maaned='$maaned'
> > > > AND aar='$aar' ORDER BY dag_maaned
> > > >
> > > > Det hele fungerer nu som det skal, men så er spørgsmålet så bare om
det
> > er
> > > > korrekt at lave det på den måde?
> > >
> > > Hvis jeg forstår dig rigtigt, så ja. Omend jeg har lidt svært ved at
se,
> > > hvorfor du har behov for en distinct. Både i denne og den foregående
> > > forespørgsel. Finder du netop ikke én række for hver dag i en given
> > > måned i et givet år? Dvs. for september 2002 finder du 30 rækker. I så
> > > fald er der ingen dubletter at frasortere.
> >
> > Nej, jeg skriver at der kommer en ny række for hver sidevisning, så
derfor
> > kommer der let 10 rækker for hver time og derved omkring 240 rækker for
et
> > helt døgn. ;)
>
> Ah! Uden et tabel-layout var det jo ikke lige til at gennemskue. Okay.
Undskyld så, men jeg mente ellers det stod rimelig tydeligt. ;(
> (Det er i praksis altid en god idé at poste en komplet beskrivelse af de
> tabeller, der indgår i den forespørgsel man har problemer med.)
>
> > > > Hvordan foregår det i det hele taget?
> > > > Umiddelbart ville jeg jo tro at den ville finde 7 forskellige
"dag_uge"
> > og
> > > > så derved kun kunne fortsætte med at finde 7 "dag_maaned", eller har
jeg
> > > > misforstået noget?
> > >
> > > Ja. Distinct opererer på rækkeniveau. Det vil sige at den frasorterer
> > > række-dubletter.
> >
> > Du svarede ja til at jeg havde misforstået det, eller hvad?
> > Det med rækkeniveau må du nok forklare lidt bedre.
>
> Jeg skal prøve. Det er i virkeligheden meget simpelt.
>
> Betragt "Tabel"
>
> navn dato
> ============
> peter 01012002
> peter 01012003
> hans 01012002
> hans 01012002
>
> "select * from tabel" vil give alle fire rækker.
>
> "select distinct * from tabel" vil give
>
> navn dato
> ============
> peter 01012002
> peter 01012003
> hans 01012002
>
> idet rækken (hans, 01012002) forekommer to gange. Den ene forekomst
> bliver sorteret fra.
>
> "select distinct navn from tabel" vil derimod give
>
> navn
> ========
> peter
> hans
>
> idet det ikke længere er muligt at skelne mellem (peter, 01012002) og
> (peter, 01012003).
>
> Essentielt skal du forestille dig, hvad der kommer ud af din select,
> hvis du ikke bruger distinct, og derefter fjerne alle dubletter.
Det er også sådan at jeg har forstået det efter at have haft gang i en lang
diskution på
www.eksperten.dk
Problemet nu er dog bare at det kun er "dag_maaned" jeg jo skal frasortere
dubletter af og "dag_uge" sådan set bare er dér fordi jeg vil kunne trække
det ud, så jeg ikke skal hen og lave 30 queries mere som finder ugedagen.
Det virker fint med "dag_uge" at sætte det med ind i DISTINCT, men det kunne
jo tænkes at man på et senere tidspunkt ville få brug for at trække det
unikke id for rækken ud, så når først dét kommer ind i DISTINCT, så er der
jo intet der er helt ens.
Hvordan skal man så bære sig ad med at få det med? Det var dér jeg tænkte på
GROUP BY, hvor jeg på
www.eksperten.dk fik at vide at man ikke kunne lægge
noget i SELECT som ikke også stod i GROUP BY. Så nu er jeg på ret bar bund.
> > > > Jeg har også kigget på GROUP BY, hvilket samtidig kan bruges som
ORDER
> > BY da
> > > > man kan sætte DESC bagved. Men så er spørgsmålet bare hvad der er
bedst
> > at
> > > > bruge?
> > >
> > > Til hvad?
> >
> > Det samme som DISTINCT, da man derved kan trække andre data ud af rækken
> > ganske normalt, uden at skulle placere det i DISTINCT som jeg endnu ikke
har
> > forstået hvordan kan lade sig gøre...
> > Jeg har nemlig også fået at vide at når man udfører en DISTINCT, så
sørger
> > MySQL selv for at lave det om til en GROUP BY, derfor ser jeg ingen idé
i at
> > bruge DISTINCT, hvis det er mere korrekt at bruge GROUP BY.
>
> Man kan ikke tale om at det ene er mere korrekt end det andet. Efter min
> mening er distinct bedre, hvis formålet er at fjerne dubletter og ikke
> andet, simpelthen fordi det klart udtrykker hvad formålet er. Hvis jeg
> ser en select med en group by, vil jeg først give mig til at lede efter
> aggregat-funktionen, og - når jeg ikke finder den - overveje om
> programmøren har begået en fejl. Først derefter vil det gå op for mig,
> at programmøren har valgt at benytte group by til at implementere sin
> egen version af distinct.
Jeg tænkte bare at GROUP BY måtte være den bedste, nu da jeg har hørt at
MySQL jo laver DISTINCT om til GROUP BY... Så ser jeg nærmest DISTINCT for
en omvej. Så kan man jo lige så godt vælge den korteste vej.
> Men i øvrigt: hvis du ved, at group by gør det samme som distinct, hvori
> består problemet så med at forstå, hvad distinct gør? Nå, jeg håber det
> allerede er opklaret udfra ovenstående forklaring.
Jeg har i dag lært at det der står i DISTINCT ikke bliver afviklet i nogen
rækkefølge, men de to skal kombineres. Så er problemet bare hvordan jeg skal
få "dag_uge" med også.
> > > "Group by" benyttes, hvis du har brug for at foretage en gruppering.
Det
> > > vil typisk sige når man skal bruge aggregate functions (er der et godt
> > > dansk ord for det?) som max, count osv. En bivirking ved "group by" er
> > > at output bliver sorteret. Det har fået udviklerne af MySQL til at
> > > opfinde "group by ... desc" som forkortelse for "group by ... order by
> > > ... desc". Jeg vil godt advare imod at bruge denne forkortelse. Man
> > > vinder intet (eller stort set intet) ved den, men får til gengæld et
> > > produkt, der ikke kan porteres.
> >
> > Det med at sætte DESC bagved synes jeg heller ikke er specielt godt...
Men
> > jeg havde ligeledes bare fået at vide at ORDER BY ikke skulle virke
samtidig
> > med GROUP BY!?
>
> Det er ganske enkelt noget vås! Med mindre der er tale om en bizar
> specialitet i MySQL, som jeg ikke har hørt om tidligere.
Det er også noget vås. ;)
> > > Hvis formålet udelukkende er at sortere, bør man bruge "order by".
> >
> > Jeg bruger altid ORDER BY, og jeg går heller ikke efter GROUP BY pga.
> > sorteringen.
> >
> > > En anden bivirkning ved "group by" er, at den fjerner dubletter og
> > > dermed kan bruges i stedet for distinct. Også dette vil jeg advare
imod
> > > - det gør det mere uklart, hvad der egentlig foregår i koden.
> >
> > Igen har jeg fået at vide at DISTINCT ændres til GROUP BY af MySQL.
>
> Ja, det er sikkert den måde MySQL i praksis udfører kommandoen. Men det
> bør ikke være din første bekymring som programmør, hvad der foregår
> bagved gardinet. Korrekthed og læselighed går forud for effektivitet.
> (Hvis effektivitet derefter viser sig at være dårlig, kan man gå på
> kompromis med læseligheden, men det er en helt anden snak.) Og da det
> yderlige *ikke* er mindre effektivt at bruge den mere læselige version,
> så ser jeg ingen grund til ikke at bruge den.
Jeg har det sådan at jeg gerne vil lave det på den aller bedste måde, så jeg
ikke konstant skal tjekke mine scripts igennem for at lede efter gamle koder
og sådan, som ikke understøttes af den nyeste version.
--
M.v.h. Morten Jørgensen
http://bytte.startlinket.dk
StartLinket.dk´s - 1:1 BytteProgrammer