Avatar billede sumokadet Nybegynder
28. februar 2007 - 00:47 Der er 2 kommentarer og
1 løsning

Oversigt over antal vundne og tabte kampe

Jeg har følgende struktur i min database:

CREATE TABLE `kampdeltagere` (
  `rk_id` int(11) NOT NULL auto_increment,
  `rk_kamp_id` int(11) NOT NULL default '0',
  `rk_person_id` int(11) NOT NULL default '0',
  `rk_type` enum('Taber','Vinder') NOT NULL default 'Taber',
  UNIQUE KEY `rk_id` (`rk_id`)
) TYPE=MyISAM ;

Et eksempel på noget af det data, der ligger i den tabel: I kamp nummer 7, var personen 14 vinder, og 13, 21 og 52 tabere. I kamp 6 var person 52 vinder og 21 taber. Det ser således ud

rk_id, rk_kamp_id, rk_person_id, rk_type
1      7      14      Vinder
2     7     21     Taber
3     7     13     Taber
4     7     52     Taber
5      6      52      Vinder
7     6     21     Taber

Mit ønsker er at lave et udtræk der giver mig nogle rækker, der ser således ud (givet det ovenstående data). Altså en opsummering for hver person, hvor mange vundne og hvor mange tabte kampe han har:

[person_id], [vundne_kampe], [tabte_kampe]
14 1 0
21 0 2
13 0 1
52 1 1

Det bedste jeg har kunnet komme op med indtil videre er:

SELECT `rk_person_id`, COUNT(*) AS vundne FROM `kampdeltagere` WHERE `rk_type`='Vinder' GROUP BY `rk_person_id`
UNION
SELECT `rk_person_id`, COUNT(*) AS tabte FROM `kampdeltagere` WHERE `rk_type`='Taber' GROUP BY `rk_person_id`

Det giver bare et lidt uventet resultat:

[person_id] [vundne] [tabte]
14 1 -
52 1 -
21 2 -
13 1 -
52 1 -

Som sådan er tallene korrekte nok (14 og 52 har hver vundet én kamp, og 21 tabt 2, 13 og 52 tabt 1 hver). Men i stedet for at være samlede som mit ønske-resultat ovenover kommer det på en mystisk måde "efter hinanden"...

Jeg håber forklaring giver mening... Ellers så bare skriv tilbage, så skal jeg prøve at forklare bedre.
Avatar billede arne_v Ekspert
28. februar 2007 - 00:55 #1
prøv:

SELECT rk_id,COUNT(IF(rk_type='Vinder',1,0)),COUNT(IF(rk_type='Taber',1,0)) FROM kampdeltagere GROUP BY rk_id
Avatar billede sumokadet Nybegynder
28. februar 2007 - 01:00 #2
Du var tæt på... men du ledte mig på det rigtige spor! Følgende løser problemet:

SELECT rk_person_id, SUM(IF(rk_type='Vinder',1,0)) AS vundne, SUM(IF(rk_type='Taber',1,0)) AS tabte FROM kampdeltagere GROUP BY rk_person_id

Det er din kode - blot har jeg smidt SUM ind i stedet for COUNT så giver den det ønskede. Smid et svar og du har tjent lidt point!
Avatar billede arne_v Ekspert
28. februar 2007 - 01:13 #3
ja - selvfølgelig skal det være sum  - ak ak

og et svar
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