/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
GROUP BY på mere end én kolonne - hvordan?
Fra : Jesper H


Dato : 28-08-06 09:31

Hej N.G.

Jeg sidder og ka' ik' hit' ud af det. Jeg en tabel med deltagere i
MySQL, som hver har valgt sig ind på tre forskellige aktiviteter.
Derfor har hver deltager tre felter, hvor der står deres valg (som
forøvrigt refererer til et id i en anden tabel, som dog ikke bruges
lige her).

Jeg vil gerne kunne lave et query, hvori jeg kan få udledt hvor mange,
der har valgt aktivitet 1 som 1. ønske, aktivitet 1 som 2. ønske,
aktivitet 1 som 3. ønske, og ligeledes aktivitet 2 som 1. ønske,
aktivitet 2 som 2. ønske, osv. osv..

Jeg ved, at jeg kan lave det i tre queries, i retningen af:
SELECT valg_1, COUNT(id) AS valg_1_antal FROM deltagere GROUP BY valg_1
ORDER BY valg_1;
SELECT valg_2, COUNT(id) AS valg_2_antal FROM deltagere GROUP BY valg_2
ORDER BY valg_2;
SELECT valg_3, COUNT(id) AS valg_3_antal FROM deltagere GROUP BY valg_3
ORDER BY valg_3;

Meeeen, er der ikke en mere elegant måde? Evt. noget med at inddrage
den anden tabel med aktiviteterne?

På forhånd tak.

Mvh Jesper
--
http://www.tandklinikken-vesterbro.dk/ , http://fdf.dk/landsdel1/


 
 
Jens Gyldenkærne Cla~ (28-08-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 28-08-06 10:34

Jesper H skrev:

> Jeg sidder og ka' ik' hit' ud af det. Jeg en tabel med
> deltagere i MySQL, som hver har valgt sig ind på tre
> forskellige aktiviteter. Derfor har hver deltager tre felter,
> hvor der står deres valg

Det er et uheldigt design (som dine aktuelle forespørgselsproblemer
netop viser). Du må ikke have to (eller flere) felter der gemmer
samme information - og det har du netop her.

I stedet bør du oprette en tabel til at gemme sammenkædningen af
deltagere og aktiviteter:

tblValg
- deltagerID
- aktivitetsID
- prioritet
(evt. oprettet_dato)

Nøglen er deltagerID + aktivitetsID - dermed sikrer du at en
deltager ikke kan vælge samme aktivitet flere gange. En alternativ
nøgle kan være deltagerID + prioritet - hvorved man sikrer at en
deltager ikke kan oprette flere valg med samme prioritet.

Det er ikke muligt at definere at der netop skal være tre
aktiviteter pr. deltager i selve databasen, men det er en regel der
kan håndhæves af den applikation der benytter databasen.
--
Bolig søges. Andel eller leje i Emdrup, Nordvest, Nørrebro, Søborg
eller Brønshøj, max 6000 pr. måned.
Kontakt pr. mail - nospam(at)gyros.dk
Jens Gyldenkærne Clausen

Jesper H (28-08-2006)
Kommentar
Fra : Jesper H


Dato : 28-08-06 13:36


Jens Gyldenkærne Clausen skrev:

> Jesper H skrev:
>
> > Jeg sidder og ka' ik' hit' ud af det. Jeg en tabel med
> > deltagere i MySQL, som hver har valgt sig ind på tre
> > forskellige aktiviteter. Derfor har hver deltager tre felter,
> > hvor der står deres valg
>
> Det er et uheldigt design (som dine aktuelle forespørgselsproblemer
> netop viser). Du må ikke have to (eller flere) felter der gemmer
> samme information - og det har du netop her.
>
> I stedet bør du oprette en tabel til at gemme sammenkædningen af
> deltagere og aktiviteter:
>
> tblValg
> - deltagerID
> - aktivitetsID
> - prioritet
> (evt. oprettet_dato)
>
> Nøglen er deltagerID + aktivitetsID - dermed sikrer du at en
> deltager ikke kan vælge samme aktivitet flere gange. En alternativ
> nøgle kan være deltagerID + prioritet - hvorved man sikrer at en
> deltager ikke kan oprette flere valg med samme prioritet.
>
> Det er ikke muligt at definere at der netop skal være tre
> aktiviteter pr. deltager i selve databasen, men det er en regel der
> kan håndhæves af den applikation der benytter databasen.
> --
> Bolig søges. Andel eller leje i Emdrup, Nordvest, Nørrebro, Søborg
> eller Brønshøj, max 6000 pr. måned.
> Kontakt pr. mail - nospam(at)gyros.dk
> Jens Gyldenkærne Clausen

Hej Jens

Tak for dit svar - vidste ikke, at man kunne lave en sådan
"kombineret" nøgle. Man kan ikke lave deltagerID + aktivitetsID +
prioritet? Er ikke lige sikker på hvordan man i så fald gør det.

Mvh Jesper
--
http://www.tandklinikken-vesterbro.dk/ , http://fdf.dk/landsdel1/


Kristian Damm Jensen (07-09-2006)
Kommentar
Fra : Kristian Damm Jensen


Dato : 07-09-06 09:57

Jesper H wrote:
> Hej N.G.
>
> Jeg sidder og ka' ik' hit' ud af det. Jeg en tabel med deltagere i
> MySQL, som hver har valgt sig ind på tre forskellige aktiviteter.
> Derfor har hver deltager tre felter, hvor der står deres valg (som
> forøvrigt refererer til et id i en anden tabel, som dog ikke bruges
> lige her).
>
> Jeg vil gerne kunne lave et query, hvori jeg kan få udledt hvor mange,
> der har valgt aktivitet 1 som 1. ønske, aktivitet 1 som 2. ønske,
> aktivitet 1 som 3. ønske, og ligeledes aktivitet 2 som 1. ønske,
> aktivitet 2 som 2. ønske, osv. osv..
>
> Jeg ved, at jeg kan lave det i tre queries, i retningen af:
> SELECT valg_1, COUNT(id) AS valg_1_antal FROM deltagere GROUP BY
> valg_1 ORDER BY valg_1;
> SELECT valg_2, COUNT(id) AS valg_2_antal FROM deltagere GROUP BY
> valg_2 ORDER BY valg_2;
> SELECT valg_3, COUNT(id) AS valg_3_antal FROM deltagere GROUP BY
> valg_3 ORDER BY valg_3;
>
> Meeeen, er der ikke en mere elegant måde? Evt. noget med at inddrage
> den anden tabel med aktiviteterne?

Jeg kan forestille mig en række åder at gøre det mere elegant; men de
forudsætter alle nogle antagelser om indholdet i din tabel. Uden nærmere
kendskab til din DDL og dit dataindhold kan jeg ikke give nogen bud.

Kristian



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408915
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste