Toon posts:

[MySQL] Eerst ORDER BY, dan pas GROUP BY

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil in één query de nieuwste toevoegingen halen voor elke klas.
Er zijn 6 klassen (1 t/m 6).

Ik heb dus eerst deze query geprobeerd:
SELECT id, type, vak, datumtijd FROM school GROUP BY klas ORDER BY datumtijd DESC;

Het probleem is alleen, dat hij dan eerst die GROUP BY uitvoert, en daarna pas
"ORDER BY datumtijd". Daardoor krijg ik dus alleen de eerste toevoegingen.

Toen had ik het geprobeerd met de query
SELECT id, type, vak, datumtijd FROM school GROUP BY datumtijd, klas ORDER BY datumtijd DESC, klas;

Deze geeft wel de hele lijst in volgorde, maar daarop moet ik dan dus NOG een GROUP BY op uitvoeren wil ik het gewenste resultaat. (Dan kan ik dus net zo goed die eerste GROUP BY in deze query weglaten)

Ik heb al in de MySQL Manual (GROUP BY en ORDER BY) gekeken maar het heeft me niks geholpen, omdat dit ook moeilijk te verwoorden valt zonder voorbeelden te geven weet ik ook niet waar ik op moet zoeken. Iemand die snapt wat ik bedoel en hoe ik het gewenste resultaat krijg?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Ik denk dat onderstaande in de richting komt van de oplossing van je probleem. Met alleen group/order by kom je er niet, je zal met where/having moeten werken.

code:
1
2
3
4
5
SELECT id, type, vak, datumtijd, MAX(datumtijd) AS maximum
FROM school
HAVING datumtijd = maximum
GROUP BY klas
ORDER BY datumtijd DESC


Ik heb wel een query in mijn hoofd die volgens mij zeker zou moeten werken, maar die doet het helaas niet in de meeste MySQL versies.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Ik draai MySQL 4.1.7, het valt altijd te proberen :)

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

code:
1
2
3
4
5
6
7
SELECT s.id, s.type, s.vak, s.datumtijd 
FROM school s 
WHERE s.datumtijd = 
  ( SELECT MAX(s2.datumtijd)
    FROM school s2
    WHERE s2.klas = s.klas
  )

Who is John Galt?


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

code:
1
2
3
4
5
6
7
8
9
SELECT id, type, vak, datumtijd, klas
FROM school AS s
WHERE datumtijd = (
  SELECT MAX(datumtijd)
  FROM school
  WHERE klas = s.klas
)
GROUP BY klas
ORDER BY datumtijd DESC

Zoiets?

He bah, net 10 sec te laat. :) Justmental :w

[ Voor 13% gewijzigd door NMe op 29-10-2004 22:41 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

NMe84 schreef op 29 oktober 2004 @ 22:40:
He bah, net 10 sec te laat. :) Justmental :w
Maar ik was de order by vergeten ;) :o
Die group by heeft alleen geen zin meet omdat je toch maar 1 record per klas over houdt (als dezelfde datumtijd maar 1x per klas voor mag komen).

Who is John Galt?


Verwijderd

Topicstarter
Volgens mij heb ik het niet helemaal goed uitgelegd :)
Ik hoop dat dit het wat duidelijker maakt:

Ik wil dus eigenlijk deze 6 queries in één query stoppen (liefst zonder subqueries):
SELECT id, type, vak, datumtijd FROM school WHERE klas = '1' ORDER BY datumtijd DESC LIMIT 1;
SELECT id, type, vak, datumtijd FROM school WHERE klas = '2' ORDER BY datumtijd DESC LIMIT 1;
SELECT id, type, vak, datumtijd FROM school WHERE klas = '3' ORDER BY datumtijd DESC LIMIT 1;
SELECT id, type, vak, datumtijd FROM school WHERE klas = '4' ORDER BY datumtijd DESC LIMIT 1;
SELECT id, type, vak, datumtijd FROM school WHERE klas = '5' ORDER BY datumtijd DESC LIMIT 1;
SELECT id, type, vak, datumtijd FROM school WHERE klas = '6' ORDER BY datumtijd DESC LIMIT 1

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 29 oktober 2004 @ 22:49:
Volgens mij heb ik het niet helemaal goed uitgelegd :)
Ik hoop dat dit het wat duidelijker maakt:

Ik wil dus eigenlijk deze 6 queries in één query stoppen (liefst zonder subqueries):
8<
Ehm, dat doet de query die we gaven nagenoeg. 8)7

code:
1
2
3
4
5
6
7
8
SELECT id, type, vak, datumtijd
FROM school AS s
WHERE datumtijd = (
  SELECT MAX(datumtijd)
  FROM school
  WHERE klas = s.klas
)
ORDER BY klas

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

NMe84 schreef op 29 oktober 2004 @ 22:52:
[...]

Ehm, dat doet de query die we gaven nagenoeg. 8)7

code:
1
2
3
4
5
6
7
8
SELECT id, type, vak, datumtijd
FROM school AS s
WHERE datumtijd = (
  SELECT MAX(datumtijd)
  FROM school
  WHERE klas = s.klas
)
ORDER BY klas
Kan MySQL 4.1.7 met subqueries overweg?

Verwijderd

Topicstarter
NMe84 schreef op 29 oktober 2004 @ 22:52:
[...]

Ehm, dat doet de query die we gaven nagenoeg. 8)7

code:
1
2
3
4
5
6
7
8
SELECT id, type, vak, datumtijd
FROM school AS s
WHERE datumtijd = (
  SELECT MAX(datumtijd)
  FROM school
  WHERE klas = s.klas
)
ORDER BY klas
Sorry, het is vrijdagavond :p het vervelende is alleen dat deze query er 6,90 seconden over doet. Dit moet toch sneller kunnen lijkt mij, of is dit niet anders mogelijk in MySQL?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 29 oktober 2004 @ 22:58:
Kan MySQL 4.1.7 met subqueries overweg?
Blijkbaar. :P
Verwijderd schreef op 29 oktober 2004 @ 22:59:
Sorry, het is vrijdagavond :p het vervelende is alleen dat deze query er 6,90 seconden over doet. Dit moet toch sneller kunnen lijkt mij, of is dit niet anders mogelijk in MySQL?
Misschien dat je de subquery kan aanpassen zodat ie geen gebruik meer maakt van de MAX functie, en in plaats daarvan alles selecteren, sorteren op datumtijd, en dan met LIMIT zorgen dat je maar 1 record terug krijgt, maar ik denk niet dat dat veel snelheidsverschil zal opleveren, en waarschijnlijk is het zelfs langzamer. Volgens mij zul je het hiermee moeten doen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Verwijderd schreef op 29 oktober 2004 @ 22:59:
Sorry, het is vrijdagavond :p het vervelende is alleen dat deze query er 6,90 seconden over doet. Dit moet toch sneller kunnen lijkt mij, of is dit niet anders mogelijk in MySQL?
Dat moet je dan met een index oplossen.
Een gecombineerde index op klas en datumtijd als dat kan.

Who is John Galt?

Pagina: 1