【问题标题】:How to group by in SQL by largest date (Order By a Group By)如何在 SQL 中按最大日期分组(Order By a Group By)
【发布时间】:2017-08-22 00:11:28
【问题描述】:

我有以下数据库表

这是我的示例数据。

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

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

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

这将返回以下结果。

请注意日期不是最新日期。我为 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 的一个,就像我尝试的第一个查询的图片一样,但它应该显示显示“latestone”的 apntoken

我需要这个的原因是,我总是将“最新”令牌发送给苹果,以获取特定设备的推送通知。每次用户登录设备时都是相同的,但 apntoken 可以不同。所以我想如果我可以从设备中为用户获取最新的 apntoken,这就可以解决问题。

我尝试过的其他查询

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

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

【问题讨论】:

  • 按设备 ID、apntoken 分组...
  • 我忘了说我试过了,但这对我不起作用将编辑问题
  • group by 用于聚合函数为 min , count .. 我在您的查询中看不到任何聚合函数 .. 如果您需要唯一的行,您可以使用 distinct ..(但不同且分组没有意义)
  • 我最近修改了问题以使其更清楚,让我知道这是否有帮助,基本上我需要以某种方式对 deviceid 的 Group By 进行 Order By,它按 createdDate 对分组进行排序最新的
  • 按创建的 desc 排序如何

标签: mysql sql group-by having


【解决方案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
    )

【讨论】:

  • 当然 :) not exists 子句声明与原始表(别名 dm)具有相同用户 ID (=20) 和设备 ID 但创建日期较晚的任何行不应存在于选择的结果。仅保留每个 userid=20 和 deviceid 的最新行。瞧!
  • 在互联网上搜索“相关子查询”;很多关于它的文献
  • 感谢您对我的问题和信息的回答,我可以看到我在这个主题上有很多阅读要做:)。
  • 顺便说一句,在这个查询中选择 1 的目的是什么?
  • 我现在明白了,所以这是一个效率问题(当你不需要的时候为什么要选择所有列),谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
相关资源
最近更新 更多