In de producten tabel staan de producten met uniek volgnummer, hetzelfde voor gebruikers. In de wijzigingen tabel wordt bijgehouden wanneer een gebruiker een product wijzigt. Nu wil ik graag een lijst publiceren met:
product, gebruiker, timestamp waarbij gebruiker en timestamp het jongste record voor dat product is, m.a.w. de gebruiker die het product het meeste recent heeft gewijzigd en de timestamp waarop dat gebeurde, gesorteerd op product.
De volgende query geeft wel het overzicht, daarbij is de datum echter de oudste (dus de eerste keer dat er een wijziging plaatsvond):
SELECT *
FROM producten
INNER JOIN wijzigingen ON producten.pid = wijzigingen.pid
INNER JOIN gebruikers ON wijzigingen.gid = gebruikers.gid
GROUP BY producten.pid
ORDER BY producten.product ASC, wijzigingen.timestamp DESC
Wat zie ik over het hoofd?
[size=xsmall]Toevoeging op 02/07/2021 09:07:31:[/size]
Wanneer ik het volgende wijzig in de query, gaat het zoals gehoopt:
SELECT producten.product, gebruikers.gebruiker, MAX(wijzigingen.timestamp) AS timestamp
SELECT p.pid, p.product,
subq.laatstetime,
g.gebruiker
FROM producten p
JOIN (SELECT MAX(wijzigingen.timestamp) AS laatstetime,
wijzigingen.pid
FROM wijzigingen
GROUP BY wijzigingen.pid ) AS subq
ON subq.pid = p.pid
JOIN wijzigingen w ON w.timestamp = subq.laatstetime AND w.pid = p.pid
JOIN gebruikers g ON g.gid = w.gid
[size=xsmall]Toevoeging op 15/09/2021 12:21:54:[/size]
in de post van 7 sept gebruik je ook nog tid en zid
TIP:
gebruik namen voor de kolommen die ook over een jaar nog begrijpelijk zijn.
Ik heb ooit moeten werken in een berg code waar het wemelde van de gid, tid, docid, ldocid etc.
Het kost weinig om de kolom gid gewoon gebruiker_id te noemen. Want op een gegeven moment komt er nog een id kolom bij voor een tabel die ook met een G begint.
[size=xsmall]Toevoeging op 15/09/2021 13:08:53:[/size]
mischien nog even een uitleg erbij:
De subquery verzameld de recentste wijziging per productid.
Dat gejoind met producten levert je dan de recentste wijziging bij je product.
Daarna kijk ik weer naar de tabel wijzigingen als geheel.
Daarbij pak ik de in de subquery gevonden "laatstetime" om het betreffende record in z'n geheel te vinden.
En om te voorkomen dat er 2 producten gelijktijdig zijn aangepast en dit in de soep loopt, kan deze join-voorwaarde nog uitgebreid worden met :
AND w.pid = p.pid
Als het goed is, hebben we nu precies 1 record in Wijzigingen te pakken.
Daar wordt dan over gid nog de tabel Gebruikers tegenaan gejoind, zodat we ook de gebruiker die de laatste aanpassing deed zullen vinden.
--
edit: tekst wat ingekort en AND w.pid = p.pid in de query toegevoegd.