MAX(datetime) per user

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jochanan V

Jochanan V

23/03/2013 21:03:44
Quote Anchor link
Heb een tabel die er als volgt uit ziet:
Afbeelding

Ik wil een query uitvoeren die de gebruikers ophaalt met hun value, die status 1 hebben, maar dan wel hun laatst bestaande value.

De volgende query heb ik, maar nu zoekt hij de laatste datum, en daarbij de gebruikers die die datum hebben en met status 1. (ps. status van bovenstaande tabel komt uit andere tabel, maar even voor gemak bij gezet.

SELECT r.`matchdate`, r.`value` as `value`, r.`user`, u.`status`, u.`id`, u.`name`
FROM `userrating` r, `users` u
WHERE r.`user` = u.`id`
AND u.`status` = '1'
AND matchdate= (SELECT MAX(matchdate) FROM userrating)
GROUP BY r.`user`

Hoe krijg ik dus alle gebruikers die status 1 hebben, en vervolgens met hun laatst "behaalde" value.
Gewijzigd op 23/03/2013 21:10:07 door Jochanan V
 
PHP hulp

PHP hulp

25/12/2024 20:13:11
 
Php knipper

php knipper

23/03/2013 21:30:24
Quote Anchor link
ORDER BY id ASC (of DESC )
LIMIT 1
 
Jochanan V

Jochanan V

23/03/2013 21:40:11
Quote Anchor link
Resultaat van mijn query is dat hij alleen ID 7 laat zien, omdat die de laatste datum heeft.
Als ik je regel toevoeg, veranderd daar weinig aan. Stel dat ik meer records had met laatste datum 2013-02-05, dan laat hij met jou toegevoegde code ook nog alleen 1 record zien ipv alle gebruikers met hun laatste value.

Van bovenstaande kolom zou ik dus eigenlijk de volgende values willen zien:
Afbeelding
Gewijzigd op 23/03/2013 21:58:33 door Jochanan V
 
Reshad F

Reshad F

23/03/2013 22:13:26
Quote Anchor link
je moet de limit eruit halen. limit geeft maar 1 waarde terug namelijk
 
Jochanan V

Jochanan V

23/03/2013 22:20:35
Quote Anchor link
Reshad F op 23/03/2013 22:13:26:
je moet de limit eruit halen. limit geeft maar 1 waarde terug namelijk

Dit is mijn query die dus niet goed is, maar daar heb ik toch geen LIMIT in?!?
SELECT r.`matchdate`, r.`value` as `value`, r.`user`, u.`status`, u.`id`, u.`name`
FROM `userrating` r, `users` u
WHERE r.`user` = u.`id`
AND u.`status` = '1'
AND matchdate= (SELECT MAX(matchdate) FROM userrating)
GROUP BY r.`user`

Toevoeging op 23/03/2013 22:31:41:

Okay, ik had het laten rusten even omdat ik er niet uit kwam. Nu toch weer naar gekeken en iets met php knipper zijn reactie gedaan. de volgende query werkt:

SELECT r.`matchdate`, r.`value` as `value`, r.`user`, u.`status`, u.`id`, u.`name`
FROM `userrating` r, `users` u
WHERE r.`user` = u.`id`
AND u.`status` = '1'
ORDER BY r.`matchdate` DESC LIMIT 12

(desc limit 12 toegevoegd omdat ik er 12 moet hebben, al zijn er ook 12 gebruikers op basis van selectie wie status 1 heeft)
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/03/2013 22:52:28
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
SELECT *
FROM (
    SELECT *
    FROM `userrating`
    WHERE `status` =1
    ORDER BY `user` , `matchdate` DESC
) AS t
GROUP BY `user`
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

24/03/2013 08:28:45
Quote Anchor link
GROUP BY moet in combinatie met een aggegrate functie, en helemaal volgens de regels moeten alle kolommen in de SELECT die niet in een aggegrate staan ook in de GROUP BY.
Dus ook niet helemaal correct:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT MAX(r.`matchdate`) maxdate, r.`value` as `value`,
    r.`user`, u.`status`, u.`id`, u.`name`
FROM `userrating` r, `users` u
WHERE r.`user` = u.`id`
AND u.`status` = '1'
GROUP BY r.`user`
HAVING r.matchdate = maxdate

De nette methode:
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
18
19
20
21
SELECT
    ur.maxdate, r.`value`, ur.user_id, u.name, u.status
FROM
    (SELECT
        MAX(matchdate) maxdate, `user` user_id
    FROM
        userrating
    GROUP BY
        user_id) ur
JOIN
    userrating r
    ON  ur.user_id = r.`user`
    AND ur.maxdate = r.matchdate
JOIN
    users u
    ON ur.user_id = u.id
WHERE
    u.status = 1
ORDER BY
    ur.maxdate DESC
LIMIT 12
Gewijzigd op 24/03/2013 12:12:31 door Ger van Steenderen
 
Frank Nietbelangrijk

Frank Nietbelangrijk

24/03/2013 11:13:27
Quote Anchor link
Ger ik heb mijn ene tabel omgebogen naar twee tabellen om dit na te bootsen.
Jouw subquery (regel 4 tot 10) geeft de volgende error:

#1054 - Unknown column 'matchdate' in 'having clause'

als ik hem dan een kolom 'matchdate' meegeef dan is de query geldig maar ik krijg niet de laatste datums.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT
    matchdate, MAX(matchdate) maxdate, `user` user_id
FROM
    userrating
GROUP BY
    user_id
HAVING matchdate = maxdate
 
Jochanan V

Jochanan V

24/03/2013 11:33:42
Quote Anchor link
Ok, de query van Frank van gisteravond werkt iig. Nu kijken hoe die query van Ger in elkaar steekt...
Bedankt iig voor de reacties
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

24/03/2013 12:10:11
Quote Anchor link
@Frank, klopt was nog niet helemaal wakker, maar de gehele HAVING clause is in de laatste query overbodig, omdat er een SELF JOIN op de maxdate en user_id plaats vindt.
Het feit dat jouw query werkt is dat het mysql is én dat de full group by optie uit staat.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

24/03/2013 12:15:28
Quote Anchor link
aha Ger ik zie dat je hem aangepast hebt.
Ik ga er eens kritisch naar kijken, dank je wel!

Toevoeging op 24/03/2013 13:02:27:

Ger, ik probeer voor mezelf te verwoorden waarom een self-join?

antwoord:
omdat ik eerst GROUP BY wil toepassen en dan pas ORDER BY,
en omdat dit een één query niet mogelijk is want daar is het altijd eerst ORDER BY en dan pas GROUP by

zit ik zo op de juiste weg of zie ik het verkeerd?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

24/03/2013 15:03:51
Quote Anchor link
Frank, een self join is als de tabellen die gejoined worden dezelfde tabel is.
 



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.