如何在mysql中解决这个问题

时间:2012-09-30 01:06:38

标签: mysql database datetime

我在MySQL下面有这些记录

RecID | Description | Date | Hits | IsPublished 
1; "Test"; 04/10/2012; 45; True
2; "Test 1"; 04/10/2012; 37; True
3; "Test 2"; 05/10/2012; 12; True
4; "Test 3"; 05/10/2012; 13; True
5; "Test 4"; 07/10/2012; 14; True
6; "Test 5"; 07/10/2012; 25; True
7; "Test 4"; 08/10/2012; 23; True
8; "Test 5"; 08/10/2012; 35; True
9; "Test 9"; 12/10/2012; 7; True

想要实现以下目标

9; "Test 9"; 12/10/2012; 7; True 
8; "Test 5"; 08/10/2012; 35; True
4; "Test 3"; 05/10/2012; 13; True

基本上,第一条规则是将日期分组为08/10 / 2012,07 / 10/2012和05/10/2012以及04/10/2012。以此08/10/2012为出发点。然后删除彼此接近的任何日期(最少1天)。

BTW ......这是澳大利亚的约会(DD / MM / YYYY)。因此,结果是08/10 / 2012,05 / 10/2012。在这两个“有效”日期中,然后选择那天有更多点击的记录。然后将其他设置为IsPublished = false。

在MySQL中有任何想法吗?

1 个答案:

答案 0 :(得分:1)

首先找到没有其他行的日期,其中一天大一点:

    SELECT DISTINCT t1.Date
    FROM table_name t1
    LEFT JOIN table_name t2
      ON DATE_ADD(t1.Date, INTERVAL 1 DAY) = t2.Date
    WHERE t2.RecId IS NULL

然后找到这些日期的最大匹配数:

  SELECT Date, MAX(Hits) as maxHits
  FROM table_name
  WHERE Date IN (
    SELECT DISTINCT t1.Date
    FROM table_name t1
    LEFT JOIN table_name t2
      ON DATE_ADD(t1.Date, INTERVAL 1 DAY) = t2.Date
    WHERE t2.RecId IS NULL )
  GROUP BY Date

最后,更新与这些日期和maxHits不匹配的所有行:

UPDATE table_name toUpdate, (    
  SELECT Date, MAX(Hits) as maxHits
  FROM table_name
  WHERE Date IN (
    SELECT DISTINCT t1.Date
    FROM table_name t1
    LEFT JOIN table_name t2
      ON DATE_ADD(t1.Date, INTERVAL 1 DAY) = t2.Date
    WHERE t2.RecId IS NULL )
  GROUP BY Date) source
SET toUpdate.IsPublished = false
WHERE toUpdate.Date != source.Date OR toUpdate.Hits != source.maxHits