简体   繁体   中英

Get latest value of field using group by

I am making a query in which i want the job ids to be grouped but i want the latest timestamp row in the result which is not happening

Here is the SQL fiddle

http://sqlfiddle.com/#!9/de8769

The normal view for table is

在此处输入图片说明

The output after using this query i made

SELECT 
DISTINCT(user_id),
job_id,
message,
receiver_id,
parent,
type,
id as id FROM ai_ms_messages 
WHERE (receiver_id = '7' OR user_id = '7') AND type<>0 AND type<>2 group by job_id 
ORDER BY  max(timestamp) DESC

在此处输入图片说明

But as you can see its taking the value of id as 3 for job_id 11 but it should have taken the value 5 (as that is latest for job_id 11) and also the order is wrong. Since job_id 11 is latest not job_id 12. Is there any way to achieve this ?

The query would be:

select 
distinct(m1.user_id),
m1.job_id,
m1.message,
m1.receiver_id,
m1.parent,
m1.type,
m1.id as id from ai_ms_messages as m1
where m1.type<>0 and m1.type<>2
and m1.timestampt = (select max(m2.timestamp) from ai_ms_messages as m2 where m2.job_id = m1.job_id)

As per your query you are looking for data for receiver_id = '7' and for id =5 , receiver_id = '6' , so this is not in your query output.

Just remove where condition, or check data as per condition only.

GROUP BY groups on the first matching result it hits.

So, its preferable this method as the subquery.

SELECT * 
FROM (

SELECT DISTINCT (
user_id
), job_id, message, receiver_id, parent, 
TYPE , id AS id
FROM ai_ms_messages
WHERE (
receiver_id =  '7'
OR user_id =  '7'
)
AND TYPE <>0
AND TYPE <>2
ORDER BY TIMESTAMP DESC
) AS sub
GROUP BY job_id

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM