【问题标题】:Get top unique results, getting odd .. results获得最独特的结果,获得奇怪的..结果
【发布时间】:2013-12-04 23:48:38
【问题描述】:

我对编程很陌生,似乎无法在这里找出我的错误。

我有一个日历设置,每次用户更改一天,我都会创建一个新行。通过这种方式记录所有更改(同样是新的,id 想象有更好的方法。)每一行都有一些显示的信息,但它的主要区别是一个月一天和一年。即 1 31 2013 年。

我需要获取该月每一天的最新唯一行。因此,如果我运行 2013 年 1 月 31 日的查询,我只需要返回最近创建的行 WHERE month= '1' AND 等。

我正在使用..

SELECT t.* FROM(SELECT * FROM calendar a 
WHERE NOT EXISTS(SELECT * FROM calendar b 
WHERE b.day = a.day AND b.lastaltered > a.lastaltered))  t 
WHERE t.month = '12' AND t.year = '2013'

如果重要的话,来自 PHP。

现在,如果用户缓慢地进行更改,它可以正常工作。但是我发现如果有人很快就可以输入多天,最终有一个非常接近的时间戳(“lastaltered”),它不会在我当前的查询中返回该行。我通过将时间戳修改为以后的日期来测试它,然后它正常返回。我希望这能很好地解释我的问题。我仍然不清楚为什么更改时间戳会导致该行返回。

感谢您的宝贵时间! - 杰尔

【问题讨论】:

    标签: php mysql sql calendar unique


    【解决方案1】:

    啊......在一个不知道时间是什么的数据库中管理时间(而且他们都不知道)。

    转到here,阅读第一本书 - 它解释了时间的复杂性以及使用一种数据类型 (DateTime) 来表示不同概念的困难:

    • 固定时刻:UTC 时间 2013 年 12 月 4 日上午 10:15
    • 重复瞬间:每天上午 10:15,每周二或每月最后一个周一
    • 从锚定义的瞬间:从现在起 2 小时
    • 浮动间隔:2 小时
    • 锚定间隔:UTC 2013 年 12 月 4 日上午 10:15 到下午 12:15 2 小时
    • 不存在的瞬间:澳大利亚东部夏令时间 2014 年 10 月 5 日星期日凌晨 2:30
    • 间隔 1 小时发生两次的瞬间:澳大利亚东部夏令时间 2014 年 4 月 6 日星期日凌晨 2:30
    • ...你明白了。

    处理您的问题的最简洁的方法是使用 ValidFrom 和 ValidTo DateTime 字段,当用户创建行时,ValidFrom 设置为 now 并且 ValidTo 设置为 NULL 并执行一个触发器,将所有旧条目设置为一个 NULL ValidTo 到现在。这将提供完整的审计跟踪,您可以通过查询具有 NULL ValidTo 的条目来获取当前条目。

    【讨论】:

    • 谢谢,这似乎正是我所需要的。我的思考过程就像你所说的那样,每当插入发生时,使用位列将所有其他相同的“日”(定义为月/日/年的日)设置为“假”。我唯一需要弄清楚的是如何让触发器从插入中获取月份 = x 日 = y 年 = z 并在插入之前发生。 (将所有其他字段设置为 false)before 部分很简单,我看到有一个 before 关键字。
    猜你喜欢
    • 1970-01-01
    • 2019-12-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2020-10-08
    • 2016-04-04
    相关资源
    最近更新 更多