[MySQL] GROUP BY > meerdere resultaten per group

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • manta
  • Registratie: Juni 2002
  • Laatst online: 22-11-2023
Zit met een query waar ik niet helemaal uit kom. Gaat om de volgende situatie:
Ik heb een table met o.a. de kolommen "werknemer" en "bedrijf". Nu wil ik per bedrijf een groep van de 5 laatst toegevoegde werknemers ophalen.

De 5 laatst toegevoegde werknemers ophalen is geen probleem, er wordt dan echter geen rekening gehouden met de kolom bedrijf. Wat ik dus eigenlijk wil doen is groepjes van 5 maken per bedrijf. Met de standaard functie GROUP BY krijg ik als resultaat 1 persoon per bedrijf. Hoe kan ik daar 5 van maken?

Kan dat uberhaupt in MySQL zelf? Of moet ik daar mogelijk ook PHP voor toepassen?

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 22:02
Ik dacht aanvankelijk dat het niet kon in MySQL. Maar na wat zoeken kwam ik op dit artikel:
Here are some common SQL problems, all of which have related solutions: how do I find the most recent log entry for each program? How do I find the most popular item from each category? How do I find the top score for each player? In general, these types of “select the extreme from each group” queries can be solved with the same techniques. I’ll explain how to do that in this article, including the harder problem of selecting the top N entries, not just the top 1.
Daar worden verschillende technieken besproken.

Als je weinig werknemers per bedrijf hebt dan kan het sneller zijn om alle bedrijven en werknemers op te vragen en dan de ordenen op bedrijf en toevoegdatum.

Acties:
  • 0 Henk 'm!

Verwijderd

Als je zelf al een query hebt bedacht, hoe ziet die er uit?
Kan een medewerker aan meerdere bedrijven zijn gekoppeld?

[ Voor 4% gewijzigd door Verwijderd op 20-10-2010 13:29 ]


Acties:
  • 0 Henk 'm!

  • zzattack
  • Registratie: Juli 2008
  • Laatst online: 18:30
GROUP BY werkt met aggregate functions en niet hoe je in eerste instantie zou kunnen verwachten.
Je zou wel de meest recent toegevoegde werknemer per bedrijf kunnen vinden met bijvoorbeeld

SELECT max(wanneer_toegevoegd), werknemer FROM werknemers GROUP BY bedrijf

maar de 5 meest recentelijk toegevoegde werknemers zal niet lukken, vrees ik (als het wel gemakkelijk kan zou ik het ook graag willen weten)

Wat je wel zou kunnen doen is alle werknemers selecteren, en dan sorteren op bedrijf, wanneer_toegevoegd, dan hoef je niet alsnog in PHP te sorteren.

Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Nu online

The Eagle

I wear my sunglasses at night

Verdiep je eens in de HAVING clausule :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 23:40

Reinier

\o/

Je zou een inner join op zichzelf kunnen proberen:

SQL:
1
2
3
4
5
6
7
8
select w2.bedrijf_id , w2.werknemer_id , count( 1 ) as n
from werknemer as w1
inner join werknemer as w2
on w1.werknemer_id = w2.werknemer_id
and w1.toegevoegd <= w2.toegevoegd
group by w2.bedrijf_id , w2.werknemer_id
having count( 1 ) between 1 and 5
order by 1 desc


Niet getest, maar ik heb iets vergelijkbaars onlangs nog succesvol gebruikt (weliswaar in SQL Server 2000).

Acties:
  • 0 Henk 'm!

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20:32
Het kan wel in MySQL, met behulp van de GROUP_CONCAT() functie :)

SQL:
1
2
3
4
SELECT c.name, GROUP_CONCAT(e.name ORDER BY e.created DESC SEPARATOR ',')
FROM companies AS c
JOIN employee AS e ON c.id = e.company_id
GROUP BY c.id


Je zal alleen de namen uiteindelijk zelf uit elkaar moeten trekken op basis van de separator ;)

What do you mean I have no life? I am a gamer, I got millions!


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Morax schreef op woensdag 20 oktober 2010 @ 17:03:
Het kan wel in MySQL, met behulp van de GROUP_CONCAT() functie :)

SQL:
1
2
3
4
SELECT c.name, GROUP_CONCAT(e.name ORDER BY e.created DESC SEPARATOR ',')
FROM companies AS c
JOIN employee AS e ON c.id = e.company_id
GROUP BY c.id


Je zal alleen de namen uiteindelijk zelf uit elkaar moeten trekken op basis van de separator ;)
Dan krijg je niet de 5 meest recente.

De zoekterm voor TS is GROUPWISE MAX, daar vind je denk ik genoeg informatie over.

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1