Toon posts:

[MySQL] GROUP BY > meerdere resultaten per group

Pagina: 1
Acties:

Onderwerpen


  • manta
  • Registratie: juni 2002
  • Laatst online: 20-12-2020
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?

  • Kalentum
  • Registratie: juni 2004
  • Laatst online: 23:06
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.

PVoutput


  • underdog
  • Registratie: augustus 2002
  • Niet online
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 underdog op 20-10-2010 13:29]


  • zzattack
  • Registratie: juli 2008
  • Laatst online: 25-09 13:36
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.

  • The Eagle
  • Registratie: januari 2002
  • Laatst online: 23:49

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 :)


  • Reinier
  • Registratie: februari 2000
  • Laatst online: 02:20
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).

  • Morax
  • Registratie: mei 2002
  • Laatst online: 22:01
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!


  • 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


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee