【问题标题】:MYSQL - find and show all duplicates within date difference critriaMYSQL - 查找并显示日期差异标准内的所有重复项
【发布时间】:2015-09-07 07:25:16
【问题描述】:

下面的这个查询会选择所有的行,这些行中的同一父亲在之前注册后的注册时间不超过 335 天。有没有办法编辑这个查询,这样它就不会消除输出中的重复行?我需要在 335 天内查看该父亲的所有注册实例。

SELECT * FROM ymca_reg a later
WHERE NOT EXISTS (
    SELECT 1 FROM ymca_reg a earlier 
    WHERE 
        earlier.Father_First_Name = later.Father_First_Name
        AND earlier.Father_Last_Name = later.Father_Last_Name
        AND (later.Date - earlier.Date < 335) AND (later.Date > earlier.Date)

我目前的查询是:

SELECT ymca_reg.* FROM ymca_reg WHERE (((ymca_reg.Year) In (SELECT Year FROM ymca_reg As Tmp 
    GROUP BY Year, Father_Last_Name, Father_First_Name 
    HAVING Count(*)>1  
        And Father_Last_Name = ymca_reg.Father_Last_Name 
        And Father_First_Name = ymca_reg.Father_First_Name))) 
    ORDER BY ymca_reg.Year, ymca_reg.Father_Last_Name, ymca_reg.Father_First_Name 

此查询确实返回所有重复项以供正确查看,但它非常慢,因为它不使用连接,并且只要我添加日期条件,它只会返回后面的行。谢谢。

【问题讨论】:

    标签: mysql duplicates


    【解决方案1】:

    我想你想要这样的东西:

    SELECT *
    FROM ymca_reg later
    WHERE EXISTS (SELECT 1
                  FROM ymca_reg earlier 
                  WHERE earlier.Father_First_Name = later.Father_First_Name AND
                        earlier.Father_Last_Name = later.Father_Last_Name AND
                        abs(later.Date - earlier.Date) < 335 and
                        later.Date <> earlier.Date
                 );
    

    这应该返回所有具有此类重复项的记录。请注意,“后来”和“较早”不再是真正恰当的描述,但我留下了名称,以便您可以看到与您的查询的相似性。

    【讨论】:

    • 优秀。这对骗子们起到了作用。返回所有 dup,它只评估日期范围内的 dup。但是,它确实会返回一些在数据库中没有 dup 的单行。不知道为什么它只会返回一些独特的而不是所有独特的。
    • 我说得太早了。我不是很细心。它正在返回表中的每一行,无论是否欺骗。我确实添加了ORDER BY ymca_reg.Year, ymca_reg.Father_Last_Name, ymca_reg.Father_First_Name 以使骗子彼此相邻。但这不是原因。
    • 做到了。戈登的帮助非常大。
    猜你喜欢
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多