【问题标题】:MySQL count(distinct(email) and Group By DATE(entrydate)MySQL count(distinct(email) 和 Group By DATE(entrydate)
【发布时间】:2011-08-15 23:21:27
【问题描述】:

在获取唯一记录总数和按日期分组时遇到了一些麻烦。最终结果是我每天都得到总数,但它没有使用基于不同功能的独特电子邮件。这是我的查询...

SELECT count(distinct(emailaddress)), DATE(EntryDate)
FROM tblentries
group by   DATE(EntryDate)
ORDER BY DATE(EntryDate) desc

结果最终不会对每天的计数进行重复数据删除。想法?

谢谢!

【问题讨论】:

  • 真的可以运行吗?选择的语法应该是 SELECT COUNT(DISTINCT emailaddress)... 你有太多的括号。您的聚合列中有空值吗?
  • EntryDate 是什么类型?是Date吗?如果不是,为什么叫它日期?
  • 是的,它运行良好。不......我没有得到空值。 EntryDate 是一个时间戳。我正在使用日期函数来获取没有时间值的日期。
  • @Jeremy FYI... 将 SELECT COUNT(DISTINCT(emailaddress)) 更改为 SELECT COUNT(DISTINCT emailaddress) 会得到相同的结果。
  • 您得到什么结果表明计数没有重复数据删除?只有一排? [select count(distinct date(EntryDate)) from tblentries] 得到什么?

标签: mysql count group-by distinct


【解决方案1】:

根据对话,我相信您正在寻找的是每天不同的从未见过的电子邮件地址的数量:

SELECT
    DATE(t.EntryDate) as RecordDate,
    COUNT(DISTINCT t.emailaddress) as NewEmailAddresses
FROM
    tblentries t
WHERE
    NOT EXISTS(
        SELECT 1
        FROM tblentries t2
        WHERE
            t2.emailaddress = t.emailaddress
            AND DATE(t2.EntryDate) < DATE(t.EntryDate)
    )
GROUP BY
    DATE(t.EntryDate)
ORDER BY
    DATE(t.EntryDate) ASC;

这是我的想法,所以它可能不正确,而且会很慢,但我认为这是正确的方向。附带说明一下,如果您打算定期运行此程序,则电子邮件地址上的索引将是一个好主意。

让我知道这是否有效。

【讨论】:

  • 谢谢,杰里米。我尝试了查询但继续运行(5 分钟后我停止了它)。想法?我不打算经常运行它,并且是一次性的客户请求。也感谢您澄清差异。
  • 您有电子邮件地址的索引吗?如果不是,那将有很大的不同。如果你这样做,那么......嗯。我们还可以做其他事情,但让查询运行可能是最简单的。对于 100K 条记录,它所花费的时间不会超过 5 分钟。
  • @JeremyHolovacs 这对我来说也很好。但是我怕会影响性能。如何修改它以获得更好的性能?
  • 确保在 emailaddress 列上有一个主键和一个索引可能在除了最极端的情况之外的所有情况下都有效。
  • @JeremyHolovacs,我有类似的要求,我使用了与您的建议类似的查询,但我收到错误“选择查询中使用的未知表或别名 'r1'。”其中 r1 和 r2 等价于您的 t 和 t2。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
相关资源
最近更新 更多