[MySQL] Aantallen tellen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Repsaj_Nav
  • Registratie: Juni 2006
  • Laatst online: 15-09 14:54

Repsaj_Nav

Hallo, ik ben Jasper

Topicstarter
Ik ben bezig met een jaarboek voor mijn school, en daarvoor heb ik een enquete opgesteld. Nu heb ik een probleem met het verwerken van die gegevens.
Eerst even de betreffende tabellen:

code:
1
2
leerlingen
id | klas | voornaam | tussenvoegsel | achtervoegsel

code:
1
2
gegevens
id | llnr | forpresident
(irrelevante code is zo veel mogelijk weggelaten)
In het veld `forpresident` staan het leerlingnummer van de leerling van wie de leerling met leerlingnummer ingevuld in het veld `llnr` denkt dat deze het meeste kans heeft ooit president te worden.
Nu staat dit veld dus vol met allemaal verschillende leerlingnummers.

Ik wil weten, per klas, welk leerlingnummer het meeste voorkomt.
Ik weet dat ik de een klas aan een leerlingnummer kan koppelen met de volgende query:
SQL:
1
2
3
4
SELECT *, l.voornaam, l.tussenvoegsel, l.achternaam, l.klas FROM gegevens g
    LEFT JOIN leerlingen l
    ON g.llnr = l.id
    WHERE l.id <> 0;

Ik heb een paar uitgebreide SQL-tutorials doorgekeken en alle (?) SQL-functies doorgekeken, maar ik heb geen idee hoe ik dit aan moet pakken.
Ik wil het dus zo terug:
code:
1
2
3
4
5
response
`klas` | `naam` | `aantal`
'R6V1' | 'X' | 10
'R6V2' | 'Y' | 9
etc
Hoe krijg ik dit voor elkaar?
En hoe krijg ik de nummer twee?
Kan dit überhaupt in SQL, of moet ik dit met php gaan doen?

Alvast hartelijk bedankt voor jullie hulp!

Acties:
  • 0 Henk 'm!

Verwijderd

ORDER BY `forpresident` DESC ?

Acties:
  • 0 Henk 'm!

  • Repsaj_Nav
  • Registratie: Juni 2006
  • Laatst online: 15-09 14:54

Repsaj_Nav

Hallo, ik ben Jasper

Topicstarter
Dan staat alleen degene met het hoogste leerlingnummer bovenaan, niet degene die het vaakst gekozen wordt.

Het is dus zo dat in het persoonlijke record van iemand naast zijn/haar persoonlijke gegevens ook het leerlingnummer staat van degene op wie hij stemt.

Acties:
  • 0 Henk 'm!

  • DeluxZ
  • Registratie: Augustus 2003
  • Laatst online: 15-09 11:49

DeluxZ

Livin' the good life

een group by gebruiken ? Zoek daar eens op misschien dat je dan wel iets nuttigs vindt op het internet

]|[ Apple Macbook Pro Retina 13" ]|[


Acties:
  • 0 Henk 'm!

  • Repsaj_Nav
  • Registratie: Juni 2006
  • Laatst online: 15-09 14:54

Repsaj_Nav

Hallo, ik ben Jasper

Topicstarter
Ja geweldig :)
Dat ik daar overheen gekeken had zeg, slecht.

Dit is mijn werkende query, die ook de naam ophaalt, de klas en het llnr van de presidentskandidaat en sorteert op klas en aantal stemmen:
SQL:
1
2
3
4
5
6
7
8
9
SELECT CONCAT_WS(" ", l.voornaam, l.tussenvoegsel, l.achternaam) AS naam, l.id, l.klas, COUNT(g.id) AS aantal
    FROM gegevens g
    LEFT JOIN leerlingen l
    ON g.president = l.id
    WHERE l.id <> 0
    AND g.actief <> 0
    AND l.id = g.president
    GROUP BY g.president, l.klas
    ORDER BY l.klas ASC, aantal DESC

Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Allereest even een vraagje over je tabelstructuur: waarom houd je in een aparte tabel bij welke leerling een andere 'nomineert' om president te worden? Mag elke leerling meerdere anderen nomineren?

Jouw vraag dan: ik zie dat MySQL ondersteuning biedt voor subqueries. Ik ben zelf meer thuis in MS SQL Server, maar wellicht dat het volgende ook onder MySQL werkt:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
select 
    distinct ll.klas,
    ll_pres.voornaam,
    ll_pres.tussenvoegsel,
    ll_pres.achternaam,
    pres.aantal
from 
    Leerlingen as ll,
    (select top 1 
        gg_klas.forpresident        as forpresident,
        count(gg_klas.forpresident) as aantal
     from Leerlingen as ll_klas
     inner join Gegevens as gg_klas on (ll_klas.id = gg_klas.llnr)
     where ll_klas.klas = ll.klas
     group by gg_klas.forpresident
     order by aantal desc) as pres
inner join Leerlingen as ll_pres on (pres.forpresident = ll_pres.id)


Ik heb even geen SQL machine tot m'n beschikking, maar dit zou het globale idee moeten zijn. "ll" wordt alleen gebruikt om unieke klassen mee op te halen, "pres" is een subquery die voor ll.klas het leerlingnummer met het hoogste aantal stemmen ophaalt, en "ll_pres" bevat alle leerlinggegevens van die persoon met het hoogste aantal stemmen.

Ik zie net dat je al een query hebt gevonden. Het verschil tussen die van jou en die van mij is dat die van mij per klas alleen de leerling met de meeste stemmen retourneert.
(Oh, ik zie trouwens nu pas dat TOP niet werkt in MySQL, maar dat je aan het eind van de (sub)query in plaats daarvan "limit 1" moet gebruiken).

[ Voor 10% gewijzigd door MrBucket op 26-05-2009 21:19 ]

Pagina: 1