【问题标题】:sql query to get duplicate records with different datessql查询获取不同日期的重复记录
【发布时间】:2015-08-16 22:10:56
【问题描述】:

我需要获取不同日期字段的记录,

表格网站:

field id
reference
created

每天我们都会添加很多记录,所以我需要做一个函数来提取所有存在的记录,其中包含刚刚添加的重复行,以做一些通知。

我无法得到的条件是当天记录与表中旧数据之间的差异应该是(1天到4天)。

如果有任何简单的查询可以在不使用事务的情况下做到这一点。

【问题讨论】:

  • select fieldId,reference,count(*) as theCount from Sites group by fieldId,reference having theCount>1 ... 或 select field id,reference,count(*) as theCount from Sites group by field id,reference having theCount>1 ... 怎么样?第二个 field id 周围有反引号
  • 或者更好的是,不要让重复开始,除非日子很长,除了清理数据无事可做
  • 我认为您的问题可以写得更清楚。迄今为止的 cmets 似乎没有注意到这些不是严格的重复,而是彼此相隔 4 天内的行。此外,您的标题暗示您想要一个查询,但在问题中您说您想要一个功能。您尚未说明该表的 PK 是什么,或者至少没有说明 fieldidreference 区分每个集合的一个键以检查重复(4 天内)created 值。所以,你应该更清楚你想要什么,并提供一个你迄今为止尝试过的例子。输入和输出的样本数据也会有所帮助。
  • cmets 是一个有趣的领域,在这里人们不会愚蠢到将它们扑通一声回答@Turophile。重复是 2 天还是 92 天,有什么区别。 OP可以弄清楚
  • @Drew,我的意思是这不是典型的“我没有唯一键”重复问题,而是“我需要将表中的某些行与其他行匹配日期差异是关键差异”,问题中并不清楚。

标签: mysql sql date cakephp datediff


【解决方案1】:

我不确定我是否完全理解重复记录的含义,但这里有一个基本的日期查询:

SELECT fieldId, reference, created, DATE(created) as the_date 
FROM Sites
WHERE the_date 
BETWEEN DATE( DATE_SUB( NOW() , INTERVAL 3 DAY ) )
AND DATE ( NOW() )

【讨论】:

    【解决方案2】:

    我做了几个假设,例如:

    • 您不希望返回“第一”行
    • 重复不携带 向前日期(最初 4 天之后的下一个不重复)
    • 4 天表示 +4 天,因此包括第 5 天

    所以,我的代码是:

     with originals as (
      select s1.*
      from sites as s1
      where 0 = (
        select count(*) 
        from sites as s2 
        where s1.field_id = s2.field_id
        and s1.reference = s2.reference
        and s1.created <> s2.created
        and DATEDIFF(DAY,s2.created, s1.created) between 1 and 4
        )
      )
    select s1.* 
    from sites as s1
    inner join originals as o
    on s1.field_id = o.field_id
    and s1.reference = o.reference
    and s1.created <> o.created
    where DATEDIFF(DAY,o.created, s1.created) between 1 and 4
    order by 1,2,3;
    

    这是一个小提琴:http://sqlfiddle.com/#!3/9b407/20

    如果放宽一些条件,这可能会更简单。

    【讨论】:

      【解决方案3】:

      非常感谢每一位试图帮助我的人,

      经过大量测试,我找到了这个解决方案

      SELECT `id`,`reference`,count(`config_id`) as c,`created` FROM `sites` 
      where datediff(date(current_date()),date(`created`)) < 4    
      group by `reference`
      having c > 1
      

      非常感谢您的帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-02
        • 1970-01-01
        • 2014-01-21
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        相关资源
        最近更新 更多