Toon posts:

[MySQL] GROUP BY sort via MAX()

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als voorbeeld twee tabellen: members en table2 (de echte tabellen/query zijn uiteraard groter):

members
code:
1
2
3
4
myid hours_played
111  1.5
222  0.8
333  2.4


table2
code:
1
2
3
4
5
myid nickname     date
111  peter        1-1-2009
222  john         2-2-2009
222  johnnyboy    3-3-2009
333  joe          4-4-2009


Ter verduidelijking: een member kan verschillende nickname's gebruiken, maar deze zijn allemaal gekoppeld aan hetzelfde account (members tabel) via het myid veld.
*date is een DATETIME veld, maar ik heb het hier wat eenvoudiger weergegeven.


Wat ik wil: het meest recente record voor elke member selecteren.
Het probleem: door MAX(table2.date) te gebruiken, krijg ik inderdaad de meest recente datum voor deze member, maar de rest van het resultaat is niet afkomstig uit dezelfde row. Ter illustratie, dit krijg ik terug:

222 john 3-3-2009 <- dit is de meest recente datum, maar de nickname (en myid) behoren tot het oudere record!

Dit is wat ik verwacht te krijgen:

222 johnnyboy 3-3-2009 <- de nickname is nu afkomstig uit dezelfde row als de meest recente datum

Dit is mijn query:
SQL:
1
2
3
4
SELECT members.myid, table2.nickname, MAX(table2.date) AS date
FROM members, table2
WHERE  members.myid = table2.myid
GROUP BY members.myid

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Hoe werkt dat GROUP BY nu eigenlijk?
Je GROUP BY is al niet compleet.

Je moet alle non-aggregated velden opnemen in je Group By.

offtopic:
Hoooog tijd dat ze dat bij MySQL eens oplossen; dit is echt we-ke-lijks zo niet dagelijks aan de orde... prut DBMS :P


(En daarna moet je inderdaad wel nog even de reply hieronder lezen, daar was ik nog niet aan toegekomen :P )

[ Voor 66% gewijzigd door RobIII op 07-04-2009 15:52 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op dinsdag 07 april 2009 @ 15:44:
Dit is wat ik verwacht te krijgen:
SQL heeft geen relatie meer tussen velden van rijen bij groepering, op het moment dat je er enkele (of in jouw geval een willekeurige) uitpikt per kolom-groep. Daar is ook niet met aggregation-functies eenvoudig wat aan te doen.

De normale aanpak om 'de laatste versie' ergens bij te krijgen is door daar voor te joinen of als extra clause in de where op te nemen, met zoiets:

select ... from tabel o where o.versie = (SELECT MAX(i.versie) from tabel i where i.someid = o.someid)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beiden bedankt voor uw respons. Uiteindelijk heeft deze pagina meer opheldering geboden.