Ik heb een tabel met reacties (kolommen: reactie, naam en datum). Nu filter ik handmatig uit het totale sql-query resultaat de laatste reactie per naam. Dit omdat ik geen idee heb hoe ik dit in een mysql-query moet omschrijven. Het uiteindelijke resultaat is dus een array die even lang is als er verschillende namen zijn.
Kan iemand mij op weg helpen? bvd dank, Albert
Ger,
Ik wil niet dit topic kapen maar zou je de query willen uitleggen?
Op zich ziet hij er eenvoudig uit alleen begrijp ik even niet dat je daar een group by kunt zetten.
Komt dat door de max () die je in having gebruikt?
Je wilt van alle namen weten, wat de laatste reactie was?
-- ik denk trouwens dat je beter niet "naam" kunt opslaan, maar een user_id. Een naam kan wel eens veranderen (iemand wil zijn naam voluit schrijven of juist verkleinen etc). En een naam hoeft niet uniek te zijn.
Maar misschien moet je de opbouw van de tabel(len) even geven, voor er allerlei oplossingen komen die toch niet kloppen, omdat de opbouw van jouw database compleet anders is.
Dank voor de snelle reactie. Deze query levert bij mij een array op, even lang als er rijen in de database zitten. Gesorteerd op naam, en ook met alle datum-velden gesorteerd. Waar ik naar op zoek was, is een query die slechts de meest recente reactie van een 'naam' teruggeeft. De array is dus even lang als er verschillende namen in de database zitten.
groet, Albert
Toevoeging op 20/11/2013 12:02:01:
Dag Ivo en Ger,
Hier is de opbouw van de tabel. Voor deze vraag heb ik even het voorbeeld reacties genomen, in mijn geval is het een tabel voor een presentielijst, waarin je aangeeft of je wel of niet aanwezig zal zijn. Die FKY_LIJSTOID is een user_id, dus die komt in de plaats van 'naam' in mijn voorbeeld hierboven.
SELECT reactie, naam, MAX(datum) laatste
FROM reacties
GROUP BY reactie, naam
HAVING datum = MAX(datum)
@Bart,
Afgezien van mijn eerdere vergissing, kan je GROUP BY altijd gebruiken in combinatie met een aggegrate functie, als die in de HAVING voorkomt is het ook goed.
Je geeft vrij onduidelijke namen aan kolommen, dus ik weet even niet waarop nu juist gegroepeerd kan worden, want dat is wat er moet gebeuren.
Om jou eerdere voorbeeld aan te halen, stel je hebt een tabel met reacties:
reactie_id(int), topic_id(int), user_id(int), datum_tijd(date_time), inhoud(text)
Als ik het goed begrijp wil je ook de inhoud van de laatste reactie hebben, dus moet je eerst met een subquery per topic_id, user_id de laatste reactie datum_tijd achterhalen, en daarop dezelfde tabel joinen op die drie:
SELECT
r.datum_tijd,
r.reactie_id,
r.inhoud
FROM
(
SELECT
topic_id,
user_id,
MAX(datum_tijd) AS datum_tijd
FROM
reacties
GROUP BY topic_id,user_id
) AS lr
JOIN
reacties r
USING(topic_id,user_id,datum_tijd)
USING(kolomlijst) is verkort voor ON ... = ... AND ... = ... en kan je gebruiken als de kolommen in beide tabellen dezelfde naam hebben.
Met AS geef je een alias, maar het woordje AS wordt meestal weggelaten (de Amerikanen noemen dat noise)
Offtopic:
Ik zie tegenwoordig vrij vaak dat men kolomnamen in hoofdletters zet, is dat een nieuwe tendens ofzo?
Dank je wel, dit werkt! Mooi, die subquery! Ik vat de query nog niet helemaal, met name dat 'r.' , kan ik dat zien als een soort tijdelijke variabele?
Dit is voor mij een nogal exotische query-syntax, mijn MySQL-vocabulaire bestaat nog maar uit 5 of 6 woorden.
wb offtopic: Ik heb die gewoonte overgenomen van iemand waar ik me werkte. Het was bedoeld om onderscheid te maken tussen variabelen uit MySQL en de lokale.
Van hem heb ik ook die rare naamgeving. PKY_...OID = primary key id, FKY_...OID = foreign key id, BLN_... is boolean, STR_... = string en zo hebben we nog INT_...
Maar dat is niets recents, ik doe het al 10 jaar zo.
Als je queries hebt over meerdere tabellen hebt is het een goed gebruik om de kolommen in de query aan te spreken met de Fully Qualified Name (tabelnaam.kolomnaam).
Om onnodig veel te hoeven typen wordt dan meestal aan de tabelnaam een alias toegekend (reacties [AS] r).
Ik (e.v.a.) gebruik altijd kleine letters om duidelijk onderscheid te kunnen maken tussen SQL functies/statements en de kolomnamen.