如何按SQL在最大日期分组(按分组顺序排序)

时间:2017-03-28 18:56:09

标签: mysql sql group-by having

我有以下数据库表

enter image description here

以下是我的样本数据。

enter image description here

我想弄清楚如何编写查询以选择所有apntoken for userid =' 20'通过deviceid进行分组,然后通过apntoken进行分组(除了它应该显示最近的apntoken)。

我尝试过的一些问题就是这个。

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

返回以下结果。

enter image description here

请注意,日期不是最新日期。我添加了一个名为“最新消息”的虚假条目。在我将其日期设定为未来的地方。

我试过的另一个问题就是这个。

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

然而,这个问题是我现在有了额外的deviceid数据,因为它不再独特了吗?

参考图片

enter image description here

我不确定如何修改此查询以执行此操作或是否可以轻松实现此操作?

例如,我应该只使用我已经获得的数据' 2'领域。一个用于deviceid 5628CF60-D0CF-479A-A944-A3496E085FC8& 948D9BAD-B164-4830-ACEB-08A089A80558就像在我试过的第一个查询的图片中一样,但它应该显示说出来的最新消息'

我需要这个的原因是我总是发送最新的'标记为苹果,用于特定设备的推送通知。每次用户登录设备都是相同的,但是apntoken可以是不同的。所以我想如果我可以从设备中获取最新的apntoken用户,这将有所帮助。

我尝试的其他查询

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

enter image description here

请注意,它不显示应显示日期

的latestone

1 个答案:

答案 0 :(得分:1)

构建此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
    )