How to group by in SQL by largest date (Order By a Group By)

五迷三道 提交于 2019-12-13 17:40:16

问题


I have the following database table

Here is my sample data I have for it.

What I am trying to figure out how to do is how to write a query to select all apntoken for userid='20' grouping by deviceid and then by apntoken as well (except that it should show the most recent apntoken).

Some queries I have tried are this.

SELECT 
   DISTINCT apntoken,deviceid,created 
FROM `distribution_mobiletokens` 
WHERE userid='20' 
GROUP BY deviceid

This returns the following result.

Notice the date is not the newest date. I added a fake entry called 'latestone' for apntoken where I set its date into the future.

Another query I tried is this.

SELECT 
   DISTINCT apntoken,deviceid,created 
FROM `distribution_mobiletokens` 
WHERE userid='20' 
GROUP BY deviceid,apntoken

Problem with this one however is I have extra data for the deviceid now since its not unique anymore?

Refer to picture

I'm not sure how to modify this query to do this or if this is easily possible?

For example I should with the data I have get back only '2' fields. One for deviceid 5628CF60-D0CF-479A-A944-A3496E085FC8 & 948D9BAD-B164-4830-ACEB-08A089A80558 like in the picture for the first query I tried but it should show the apntoken that says 'latestone'

The reason I need this is so I always send the 'newest' tokens to apple for push notifications for a particular device. Everytime a user logs in the device is the same but the apntoken can be different. So I figured if I can take the newest apntoken from the device for a user this will do the trick.

OTHER Queries I've tried

SELECT apntoken,deviceid,created 
FROM `distribution_mobiletokens` 
WHERE userid='20' 
GROUP BY deviceid ORDER BY created DESC

Notice it does not show latestone which should show up with its date


回答1:


My favorite way to construct this SQL is to use a not exists clause like so:

SELECT apntoken,deviceid,created 
FROM `distribution_mobiletokens` as dm
WHERE userid='20'
and not exists (
    select 1 
    from `distribution_mobiletokens`
    where userid = '20'
    and deviceid = dm.deviceid
    and created > dm.created
    )


来源:https://stackoverflow.com/questions/43077702/how-to-group-by-in-sql-by-largest-date-order-by-a-group-by

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!