Toon posts:

Records uit MYSQL halen waar alleen de nieuwste row gewenst

Pagina: 1
Acties:

Verwijderd

Topicstarter
Goedendag allen...

Ik heb me al een slag in de rondte gegoogled, maar kan de oplossing voor mijn probleem/wens maar niet vinden. Situatie is als volgt:

Ik heb een tabel die er ongeveer zo uit ziet:

ID Naam Datum/Tijd veld1 veld2 veld3 etc
1 Piet 10-08-2006 21:10:30 a1 b1 c1 d1
2 Jan 10-08-2006 21:12:37 a2 b2 c2 d2
3 Klaas 11-08-2006 21:14:00 a3 b3 c3 d3
4 Piet 11-08-2006 01:10:45 a4 b4 c4 d4
5 Piet 11-08-2006 22:11:31 a5 b5 c5 d5


Ik wil graag met een querie alle velden hebben, waarbij slechts alleen de meest recente waarden van het veld Naam terug mogen komen.

Het resultaat moet er dus als volgt uitzien:

ID Naam Datum/Tijd veld1 veld2 veld3 etc
2 Jan 10-08-2006 21:12:37 a2 b2 c2 d2
3 Klaas 11-08-2006 21:14:00 a3 b3 c3 d3
5 Piet 11-08-2006 22:11:31 a5 b5 c5 d5

Ik heb al diverse artikelen gezien, gelezen, geprobeerd, gedaan, geprutst, etc, etc...
Maar ik krijg het maar niet voor elkaar.

Ter extra info, ik maak gebruik van MySQL v4.1.19

Iemand 'het' idee, voorbeeld, suggestie of wat dan ook?

Greetz

Verwijderd

Verwijderd schreef op zaterdag 26 augustus 2006 @ 19:24:
Goedendag allen...

Ik heb me al een slag in de rondte gegoogled, maar kan de oplossing voor mijn probleem/wens maar niet vinden. Situatie is als volgt:

Ik heb een tabel die er ongeveer zo uit ziet:

ID Naam Datum/Tijd veld1 veld2 veld3 etc
1 Piet 10-08-2006 21:10:30 a1 b1 c1 d1
2 Jan 10-08-2006 21:12:37 a2 b2 c2 d2
3 Klaas 11-08-2006 21:14:00 a3 b3 c3 d3
4 Piet 11-08-2006 01:10:45 a4 b4 c4 d4
5 Piet 11-08-2006 22:11:31 a5 b5 c5 d5


Ik wil graag met een querie alle velden hebben, waarbij slechts alleen de meest recente waarden van het veld Naam terug mogen komen.

Het resultaat moet er dus als volgt uitzien:

ID Naam Datum/Tijd veld1 veld2 veld3 etc
2 Jan 10-08-2006 21:12:37 a2 b2 c2 d2
3 Klaas 11-08-2006 21:14:00 a3 b3 c3 d3
5 Piet 11-08-2006 22:11:31 a5 b5 c5 d5

Ik heb al diverse artikelen gezien, gelezen, geprobeerd, gedaan, geprutst, etc, etc...
Maar ik krijg het maar niet voor elkaar.

Ter extra info, ik maak gebruik van MySQL v4.1.19

Iemand 'het' idee, voorbeeld, suggestie of wat dan ook?

Greetz
select * from tabelnaam order by datumtijd DESC limit 3

Is dit hem niet?

  • marko77
  • Registratie: Februari 2002
  • Laatst online: 06-05-2025
met die limit krijg je volgens mij alleen de nieuwste 3, niet per se de nieuwste pér persoon.

ik vermoed (maar kan het nu even niet testen) dat je een distinct erin moet gooien voor de username.

Mijn rig


  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07-2025
Met zoiets zou het moeten lukken.

code:
1
SELECT * FROM tabel r1 where tijd = (select max(tijd) from tabel r2 where t1.naam = t2.naam)

  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Hier zul je het keyword GROUP BY moeten gebruiken, samen met de functie MAX. Het idee is dat je alle records met eenzelfde naam wilt groeperen waarbij je de MAX datum wilt behouden.

code:
1
2
3
4
SELECT MAX(...)
FROM ...
WHERE ...
GROUP BY Naam


Indien je ook de velden 'veld1' ... in je resultaat wilt hebben, zul je ook voor deze velden iets moeten verzinnen zodat je DBMS weet welke values hij moet gebruiken tijdens het groeperen.

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


Verwijderd

Topicstarter
Het is wel de bedoeling dat de waarden van de andere velden ook meekomen inderdaad...

LIMIT kan idd niet want dan krijg je de laatste x...
En uiteraard zal de tabel straks meer gegevens bevatten...

De tip van pjotrk gaan ik eens proberen...

thnx all zover

Verwijderd

Topicstarter
Ik heb eens zitten rommelen met de suggesties...

Met de MAX operator krijg ik wel het allerlaatse record uit (met alle velden).
Echter dat is dan maar van 1 naam...

En ik wil graag van alle namen de laatste versie hebben...

Maar, ik heb in ieder geval weer wat stoei materiaal

  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07-2025
Ik zie dat ik in mijn post een typefout gemaakt had, dit had het moeten zijn:

code:
1
SELECT * FROM tabelnaam r1 where tijd = (select max(tijd) from tabelnaam r2 where r1.naam = r2.naam)


Deze heb ik net getest en werkt hier in ieder geval wel (niet op mysql getest, maar dat zou niet zoveel uit mogen maken).

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:06
Feyd-Rautha schreef op zaterdag 26 augustus 2006 @ 19:57:
Hier zul je het keyword GROUP BY moeten gebruiken, samen met de functie MAX. Het idee is dat je alle records met eenzelfde naam wilt groeperen waarbij je de MAX datum wilt behouden.
[...]
Indien je ook de velden 'veld1' ... in je resultaat wilt hebben, zul je ook voor deze velden iets moeten verzinnen zodat je DBMS weet welke values hij moet gebruiken tijdens het groeperen.
In MySQL kun je dan AFAIK gewoon dit doen:
code:
1
2
3
4
SELECT MAX(...) as date, *
FROM ...
WHERE ...
GROUP BY Naam

Correct me if I'm wrong :)

De group by van MySQL is een beetje naar vind ik zelf, houdt alleen rekening met de standaard sortering van je database (wat ook niet te overrulen valt met order by), maar volgens mij zou je zo de juiste info moeten hebben. Andere optie is natuurlijk gewoon doen wat Pjotrk voorstelt, da's stiekem nog wel mooier ook ;)

[ Site ] [ twitch ] [ jijbuis ]


Verwijderd

Topicstarter
pjotrk, je oplossing werkt als een trein!
Geweldig en dank hiervoor...

Alleen nog 1 vraagje...
Met deze oplossing heb je 2 tabellen nodig, waar in beiden de naam voorkomt.
Oftewel, er is een soort van schaduw kopie nodig.
Op zich niets engs oid, maar ik vraag me dan gelijk af...

Kan het niet met gewoon 1 database?

  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07-2025
Voor de aangegeven oplossing is er ook maar 1 tabel nodig, in de query wordt er echter 2 keer naar dezelfde tabel verwezen.

Wat er feitelijk gebeurd is dat bij het ophalen van een rij uit de database, er eerst gekeken wordt in dezelfde tabel wat de laatste datum/tijd is die bij die persoon, dmv een 'subquery':
code:
1
2
3
4
(select max(tijd) from tabelnaam r2 where r1.naam = r2.naam)
// r1 en r2 zijn tijdelijke namen die aan de tabel gegeven wordt, zodat de databaseserver weet 
// naar welk deel van de query verwezen wordt (aangezien de fysieke tabelnamen hetzelfde zijn)
// De r1.naam verwijst dus naar het eerste deel van de query.


Aan de hand van het resultaat wordt bepaald of de rij wel/niet de laatste van die persoon.
code:
1
SELECT * FROM tabelnaam r1 where tijd = {subquery resultaat}
Hierdoor blijven alleen de laatste rijen van de personen over.
Pagina: 1