Toon posts:

[MySQL] unieke laatste toevoegingen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil de laatste toevoegingen van de tabel school weergeven op de voorpagina, maar kom er niet uit welke query ik daarvoor moet gebruiken.

Er zijn 6 categorieën - veld klas(varchar(255):
Klas 1
Klas 2
Klas 3
Klas 4
Klas 5
Klas 6

De datum wanneer iets is toegevoegd staat in datumtijd (datetime);

Ik heb nu deze query:

SELECT id, vak, onderwerp, klas, datumtijd
FROM school
ORDER BY datumtijd DESC

Ik heb ook al deze geprobeerd, maar dan geeft hij alleen de oudste toevoegingen.

SELECT id, vak, onderwerp, klas, datumtijd
FROM school
GROUP BY klas
ORDER BY datumtijd DESC

Welke query moet ik nou gebruiken om de nieuwste toevoegingen te krijgen?

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Limit is het magische woord. :)

http://www.mysql.com/doc/en/SELECT.html

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Verwijderd

Topicstarter
:? LIMIT zorgt er alleen voor dat er een beperkt aantal rijen ontvangen worden. De data zelf wordt nog steeds in verkeerde volgorde teruggestuurd.

ik krijg bijvoorbeeld rijen terug met datumtijd:
10-10-2003 (eerste toegevoegde rij)
11-10-2003
12-10-2003
13-10-2003

terwijl ik eigenlijk dit terug wil hebben:
05-03-2004 (laatste toegvoegde rij)
04-03-2004
03-03-2004
02-03-2004

dat lukt wel als ik het "GROUP BY klas" weghaal, maar dan krijg ik meteen alle rijen terug, met LIMIT kan ik dat weer terugdringen naar 6, maar dan zijn ze niet van unieke "klassen" (1,2,3,4,5,6 door elkaar)

  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Voor dit probleem heb je een subquery nodig. Ik geloof dat de recente versies van MySQL dit ondersteunen, maar zo niet, dan moet je helaas uitwijken naar losse queries.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Verwijderd

Topicstarter
hmm ik kan het ook met losse queries doen, het moet toch naar PHP... ik wilde alleen zo weinig mogelijk SQL queries om sneller te werken :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23:30

NMe

Quia Ego Sic Dico.

ATS schreef op 05 maart 2004 @ 15:04:
Voor dit probleem heb je een subquery nodig. Ik geloof dat de recente versies van MySQL dit ondersteunen, maar zo niet, dan moet je helaas uitwijken naar losse queries.
Bull. Wat is er mis met dit? :?
code:
1
2
3
4
5
SELECT id, vak, onderwerp, klas, datumtijd
FROM school
WHERE 1
ORDER BY datumtijd DESC
LIMIT 0,5

Zo krijg je als het goed is de 5 nieuwste.
Verwijderd schreef op 05 maart 2004 @ 15:14:
hmm ik kan het ook met losse queries doen, het moet toch naar PHP... ik wilde alleen zo weinig mogelijk SQL queries om sneller te werken :)
En één extra query zou echt niet uitmaken hoor, tenminste niet zo'n simpele als wat hier denkbaar is. Misschien als je een database van enkele tientallen MB's hebt... ;)

[ Voor 33% gewijzigd door NMe op 05-03-2004 16:59 . Reden: 5 != 10 :P ]

'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.


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

NMe84 schreef op 05 maart 2004 @ 15:54:
[...]

Bull. Wat is er mis met dit? :?
code:
1
2
3
4
5
SELECT id, vak, onderwerp, klas, datumtijd
FROM school
WHERE 1
ORDER BY datumtijd DESC
LIMIT 0,5

Zo krijg je als het goed is de 10 nieuwste.
Zo krijg je de 5 nieuwste ja. Maar niet de nieuwste van elke klasse zoals de vraag was. :Z

Het kan denk ik trouwens wel in twee queries, e.e.a. een beetje afhankelijk van hoe je database gevuld is. Als je zeker bent dat de datumtijd uniek is, dan kan je dat gebruiken om op te selecteren in je tweede query. Als je aan de andere kant zeker weet dat je id's oplopen met de tijd, dan kan je dat gebruiken. In beide gevallen doe je eerst een query waarin je groepeerd op je klasse, en waarin je ofwel het maximum van datumtijd zoekt ofwel het hoogste id voor elke klasse. De resultaten gebruik je om op te selecteren in je volgende query.

[ Voor 43% gewijzigd door ATS op 05-03-2004 17:01 ]

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23:30

NMe

Quia Ego Sic Dico.

Dat was toch juist de bedoeling? En die 10 was een tikfout. :P
dat lukt wel als ik het "GROUP BY klas" weghaal, maar dan krijg ik meteen alle rijen terug, met LIMIT kan ik dat weer terugdringen naar 6, maar dan zijn ze niet van unieke "klassen" (1,2,3,4,5,6 door elkaar)

'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.


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Volgens mij lees je verkeerd. Ik kan me vergissen, maar volgens mij wil de TS per categorie ("Klas 1" t/m "Klas 2") het nieuwste record zien.

Stel, je hebt dit:

id cat timestamp
1 1 100
2 1 110
3 2 130
4 3 45
5 3 50
6 4 10

Het gezochte resultaat bestaat nu uit records 2,3,5 en 6, terwijl de timestamp van record 6 kleiner is dan die van record 1 en van record 4, die er beide niet in zitten.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 31-03 15:20
Tadaa:
SQL:
1
2
3
4
SELECT Klas, MAX(datumtijd) AS Laatstewijziging
FROM school 
GROUP BY Klas
ORDER BY Klas
Als je nog meer kolommen wilt, zou je een subquery moeten gebruiken, maar een self join zal het ook prima doen.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.

Pagina: 1