Ik heb nu een SQL statement die het iets te goed doet.

SELECT MAX( id ) AS id, did, 
`status` FROM mutaties
WHERE STATUS LIKE  'doorbroken%'
GROUP BY did
ORDER BY MAX(id) DESC 


Als je de volgende records hebt:

id = 1
status = 'ok'
did = 100

id = 2
status = 'doorbroken'
did = 100

id = 3
status = 'ok'
did = 100


Dan zou hij niets moeten terug geven want MAX(id) is 3, en bij 3 is de status 'ok' en niet 'doorbroken'. Toch laat hij vervolgens als resultaat zien:

id = 3, status = 'doorbroken', did = 100.

Hoe krijg ik nu enkel de records terug waarbij de status 'doorbroken' is van het hoogste id?
Beetje vreemd dit: ORDER BY MAX(id) DESC
Daar staat dus eigenlijk ORDER BY 3 DESC
Volgens mij krijg je dan als resultaat:
id = 2, (DUS NIET 3!)
status = 'doorbroken',
did = 100

En dit klopt. Wat de query namelijk eerst doet is het WHERE statement uitvoeren. Op basis van de dan geselecteerde records wordt je aggregate functie (max) uitgevoerd. Daarvan is de uitkomst 2.

Dit is denk ik dus niet wat je wilt, maar wat je wel wilt is me niet helemaal duidelijk.

- SanThe - op 15/04/2013 16:08:02

Beetje vreemd dit: ORDER BY MAX(id) DESC
Daar staat dus eigenlijk ORDER BY 3 DESC

Nee, dat staat er niet. MAX(id) in dit geval is de naam van de kolom. Omdat de TS er ook een alias aan geeft kan hij echter ook gewoon 'ORDER BY id DESC' gebruiken.
SELECT max(id) AS id, did, status
FROM mutates
WHERE status = 'doorbroken'
GROUP BY did
ORDER BY MAX(id) DESC;

en ik snap je vraag niet helemaal (betreft het een koppeltabel )? laat is zien hoe je tabbelen er uit zien
Volgens mij zou je het zo moeten doen:

SELECT a.id, a.did, a.status
FROM mutaties a
INNER JOIN (
  SELECT did, max(id) AS id
  FROM mutaties
  GROUP BY did
) b ON (
  a.did = b.did
  AND a.id = b.id
)
WHERE a.status LIKE 'doorbroken%'
ORDER BY a.id DESC;
Bedankt allemaal voor jullie antwoorden. Die van Erwin slaat de spijker op de kop! Dank je wel.

Reageren