如何按最大日期在 SQL 中分组(按分组依据排序)

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

我有以下数据库table

这是我的示例数据。

我想弄清楚如何做的是如何为 userid='20' 的所有 apntoken 编写一个查询,然后按 deviceid 分组,然后再按 apntoken(除了它应该显示最近的 apntoken)。

我尝试过的一些查询是这样的。

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

这个returns下面的结果。

注意日期不是最新日期。我为 apntoken 添加了一个名为 'latestone' 的假条目,我将其日期设置为未来。

我试过的另一个查询是这个。

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

这个有问题,但是我现在有设备 ID 的额外数据,因为它不再是唯一的了吗?

参考图片

我不确定如何修改此查询来执行此操作,或者这是否容易实现?

例如,我应该只返回“2”个字段的数据。一个用于 deviceid 5628CF60-D0CF-479A-A944-A3496E085FC8 & 948D9BAD-B164-4830-ACEB-08A089A80558 就像我尝试的第一个查询的图片中一样,但它应该显示 apntoken 'latestone'

我需要这个的原因是我总是将 'newest' 令牌发送给 apple 以获取特定设备的推送通知。每次用户登录设备时都是相同的,但 apntoken 可以不同。所以我想如果我可以从设备上为用户获取最新的 apntoken,这就可以了。

我尝试过的其他查询

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

请注意,它没有显示应该显示其日期的最新消息

我最喜欢构造这个 SQL 的方法是使用 not exists 子句,如下所示:

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
    )