Mysql query voor de laatste entries per naam

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Albert Epping

Albert Epping

20/11/2013 11:05:14
Quote Anchor link
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
 
PHP hulp

PHP hulp

29/03/2024 07:28:49
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/11/2013 11:28:16
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT reactie, naam, datum
FROM reacties
GROUP BY reactie, naam, datum
HAVING datum = MAX(datum)
Gewijzigd op 20/11/2013 11:28:44 door Ger van Steenderen
 
Bart V B

Bart V B

20/11/2013 11:40:35
Quote Anchor link
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?
 
Ivo P

Ivo P

20/11/2013 11:54:22
Quote Anchor link
ik denk dat die query niet klopt.

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.
 
Albert Epping

Albert Epping

20/11/2013 11:55:51
Quote Anchor link
Dag Ger,

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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/11/2013 12:04:14
Quote Anchor link
@Albert
Mijn fout, het moet zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
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.
 
Albert Epping

Albert Epping

20/11/2013 12:43:25
Quote Anchor link
Dag Ger,

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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/11/2013 17:43:43
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)

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
 
Albert Epping

Albert Epping

21/11/2013 09:05:26
Quote Anchor link
Dag Ger,

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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

21/11/2013 11:16:12
Quote Anchor link
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.
 
Albert Epping

Albert Epping

21/11/2013 11:47:22
Quote Anchor link
Ha Ger,

Ik heb nog een hoop te leren merk ik.
Dank zover!

groet, Albert
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.