问题
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