2015-09-05 98 views
0

下面的这个查询选择所有具有与自注册之前的335天或更少的同一父亲注册的行的行。有没有办法编辑这个查询,以便它不会消除输出中的重复行?我需要在彼此的335天内查看该父亲的所有注册情况。MYSQL - 查找并显示日期差异内的所有重复项critria

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 

此查询会返回正确审查所有的重复,而是因为它不使用加入,只要我添加日期是非常慢它只返回后面的行。谢谢。

回答

0

我想你想是这样的:

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 
      ); 

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

+0

非常好。这对于这个孪生兄弟来说是个窍门。所有的dups都会返回,它只是在日期范围内评估dups。但是,它会返回数据库中没有重复的单行。不知道为什么它只会返回一些独特的,而不是所有的独特的。 – rpbale

+0

我说得太快了。我不是很细心。它正在返回表中的每一行,不管有没有。我确实添加了 'ORDER BY ymca_reg.Year,ymca_reg.Father_Last_Name,ymca_reg.Father_First_Name' 将这些模糊相邻。但这不是原因。 – rpbale

+0

@rpbale。 。 。那个'abs()'返回的值太多了。 –