Mysql query voor de laatste entries per naam
Kan iemand mij op weg helpen? bvd dank, Albert
Code (php)
1
2
3
4
2
3
4
SELECT reactie, naam, datum
FROM reacties
GROUP BY reactie, naam, datum
HAVING datum = MAX(datum)
FROM reacties
GROUP BY reactie, naam, datum
HAVING datum = MAX(datum)
Gewijzigd op 20/11/2013 11:28:44 door Ger van Steenderen
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.
PKY_AANWEZIGOID, BLN_AANWEZIG, STR_DATE, FKY_LIJSTOID
groet, Albert
Mijn fout, het moet zijn:
Code (php)
1
2
3
4
2
3
4
SELECT reactie, naam, MAX(datum) laatste
FROM reacties
GROUP BY reactie, naam
HAVING datum = MAX(datum)
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.
Deze query levert bij mij een foutmelding op (de query kan niet uitgevoerd worden), ik weet niet waar dat aan ligt.
SELECT STR_TEXT, STR_NAAM, MAX(STR_DATE) laatste
FROM aanwezig
GROUP BY STR_TEXT, STR_NAAM
HAVING STR_DATE = MAX(STR_DATE)
de tabelindeling is: PKY_AANWEZIGOID, BLN_AANWEZIG, STR_TEXT, STR_DATE, STR_NAAM, FKY_LIJSTOID
Wat is trouwens de functie van 'laatste' in jouw code?
groet, Albert
Toevoeging op 20/11/2013 13:12:36:
Als ik de 1e regel vervang door
SELECT STR_TEXT, STR_NAAM, STR_DATE laatste
wordt de query wel uitgevoerd, maar het resultaat is leeg
groet, Albert
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)
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?
Gewijzigd op 20/11/2013 17:44:07 door Ger van Steenderen
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.
groet, Albert
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.
Ik heb nog een hoop te leren merk ik.
Dank zover!
groet, Albert