【问题标题】:How to solve this query in mysql如何在mysql中解决这个查询
【发布时间】:2012-09-30 01:06:37
【问题描述】:

我在下面的 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

基本上,第一条规则是将日期分组为 2012 年 8 月 10 日、2012 年 7 月 10 日、2012 年 5 月 10 日和 2012 年 4 月 10 日。使用这个 08/10/2012 作为起点。然后删除任何彼此接近的日期(最少 1 天)。

顺便说一句……这是澳大利亚的日期 (DD/MM/YYYY)。因此,结果是 08/10/2012、05/10/2012。在这 2 个“有效”天中,然后选择当天点击次数较多的记录。然后将其他设置为 IsPublished = false。

有什么想法可以在 MySQL 中做到这一点吗?

【问题讨论】:

  • 你能提供更多关于规则的细节吗?我不明白你的意思......“基本上,第一条规则是将日期分组为 08/10/2012、07/10/2012 和 05/10/2012 和 04/10/2012。使用这个2012 年 8 月 10 日作为基础。然后删除彼此之间的任何日期(最少 1 天)。对我来说没有多大意义。
  • @Adam:这是澳大利亚的日期 (DD/MM/YYYY)。基本上我们需要消除任何连续出现的记录,以便您可以看到 08/10/2012 和 07/10/2012 已接近(相隔 1 天),因此我们需要删除 07/10/2012 的记录。然后它找到了下一个 2012 年 5 月 10 日的,然后我们保留了这个,但删除了 04/10/2012 的。有意义吗?
  • @AdamPlocher 我同意。我从这个问题中不知道想要的结果是什么。
  • 我调整了问题,使其更清楚。
  • 啊,现在更有意义了 :)。该死的我的美国约会。

标签: mysql database datetime


【解决方案1】:

首先查找没有其他行的日期大于 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

【讨论】:

  • 感谢您的意见。我运行了查询的第一部分(首先找到没有其他行的日期大于 1 的日期)并与实际记录进行比较。发现结果不一样。
  • 如果不是 8/10 和 5/10,你会得到什么日期?是否有与这些日期相关的时间?如果是这样,您需要先使用 date() 函数将所有日期时间转换为日期...
  • 另外一件事——你能确认 MySQL 知道你使用的是“澳大利亚”日期吗?你可以运行SELECT *, DATE_ADD(Date, INTERVAL 1 DAY) FROM table_name,你应该让Date 字段增加1 天。如果它的增量有任何不同,那么这可能是你的问题。
  • 啊,我知道是什么问题。在我的真实数据中:我有一条记录,比如说 2012 年 8 月 10 日,2012 年 6 月 10 日有 2 条记录,2012 年 5 月 10 日有 2 条记录。在这种情况下,它将仅显示 06/10/2012 !!!但我也需要一个单一的出现,即 2012 年 8 月 10 日。
  • 我对问题进行了更改...请参阅 RecID = 9。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 2017-10-05
相关资源
最近更新 更多