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

2019-07-27 01:30发布

I have the following database table

enter image description here

Here is my sample data I have for it.

enter image description here

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.

enter image description here

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

enter image description here

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

enter image description here

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

1条回答
Explosion°爆炸
2楼-- · 2019-07-27 02:10

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
    )
查看更多
登录 后发表回答