【问题标题】:MySQL Filter databse query by time and look for duplicatesMySQL 按时间过滤数据库查询并查找重复项
【发布时间】:2019-12-28 06:37:51
【问题描述】:

我正在根据以前为 wordpress 找到的答案运行查询。我希望在过去半小时内查找重复的“跟踪”帖子。我想显示所有重复项并忽略该时间段内的第一篇文章。

我采取了我在时间函数中找到并添加的解决方案,但我看到了包括原始帖子在内的所有帖子,它没有删除第一个帖子。我相信这可能是因为它正在搜索表中的所有帖子,然后添加时间过滤器。我尝试将时间过滤器添加到 select 函数中,但它会出现一个错误,提示未知 post_date 列。

下面给出了过去半小时内的所有重复项,我需要它来删除第一个条目。

SELECT a. *
FROM wp_posts AS a
   INNER JOIN (
      SELECT post_title, MIN( id ) AS min_id
      FROM wp_posts
      WHERE post_type = 'track'
      AND post_status = 'publish'
      GROUP BY post_title
      HAVING COUNT( * ) > 1
   ) AS b ON b.post_title = a.post_title
AND b.min_id <> a.id
AND a.post_type = 'track'
AND a.post_status = 'publish'
AND a.post_date > subtime(now(),'0:30:0')

预期结果将是过去半小时内的所有重复,并且不会显示原始帖子。目前它给了我所有的副本和原件。

【问题讨论】:

  • 我已经尝试过您的选择查询,它工作正常,原件是否在时间限制内都没关系。我会发布我的选择,我将 wp_posts 减少到所需的最小值,但只要我一开始看不到你所做的事情,它就不是答案
  • 您好,感谢您的回复。我想你可能错过了重点。除了过去 30 分钟内,我不关心在任何时候所做的任何条目。例如,如果我查看过去 30 分钟在我的网站上发布的帖子,我可以看到帖子的标题为“电力”。它首先在 10.11 制作,然后在 10.12、10.13 和 10.14 重复制作。当查询运行时,我希望只看到条目 10.12、10.13 和 10.14。 10.11 可以忽略,因为它是原始版本,因此可以从结果中省略。
  • 我在 sqlfiddle 中尝试了您的选择,但由于 b.min_id a.id 您永远无法获得 10.11,因此我从未获得第一个。在大型数据库上,您的解决方案会检查所有行,您可以通过将其减少到所需的行来使其更快。但我仍然无法理解您的问题,您可以在此处添加行以说明您的观点吗? sqlfiddle.com/#!9/35d96f/3

标签: mysql wordpress time duplicates


【解决方案1】:
SELECT DISTINCT w1.*
FROM wp_posts AS w1
INNER JOIN wp_posts AS w2 ON w1.post_title = w2.post_title 
WHERE w1.id > w2.id 
    AND (w1.post_type, w2.post_type) = ('track', 'track')
    AND (w1.post_status, w2.post_status) = ('publish', 'publish')
     AND w1.post_date > NOW() - INTERVAL 30 MINUTE 
     AND w2.post_date > NOW() - INTERVAL 30 MINUTE;

Update: Remove older records from both tables and apply relevant filters on both.

解释:

  • 基于 post_title 的内连接将创建 N*N 条 post_title 单个值的记录。例如如果有 3 个标题为“A”的帖子,那么将有 9 条记录。
  • 现在我们将比较并从第一个表 w1 中删除 id 最小的记录(将第一个表作为基础表和输出生成表)。

  • 现在结果集包含 (N-1)* N 条记录,因为我们删除了最旧帖子的所有映射,现在这将从第一个中删除最旧的记录(30 分钟内)表。

  • 从表 w1 中删除所有没有 post_type 作为 track 且未发布的帖子。
  • 最后,删除超过 30 分钟的帖子。
  • 结果将包含帖子,但它们与 w2 表重复,因此删除重复项并仅从 w1 中选择数据。

【讨论】:

  • 您好,非常感谢您的回复。我已经尝试了您的代码,但它并没有解决问题。例如,如果我在我的网站上查看过去 30 分钟内的帖子,我可以看到帖子的标题为“电力”。它首先在 10.11 制作,然后在 10.12、10.13 和 10.14 重复制作。如果我在数据库中运行您的查询,我会遇到与我相同的问题,所有 4 个条目都会显示。当查询运行时,我希望只看到条目 10.12、10.13 和 10.14。我们怎样才能适应给我这个?
  • 我已经在上面粘贴了我的解决方案。感谢您的帮助。
  • 我看到您想排除 30 分钟内的第一条记录,而不是实际的第一条最旧记录。我的查询删除了第一条记录,而不是过去 30 分钟内的第一条记录。所以它必须在 10.11 之前但在 30 分钟之前有标题为“电力”的帖子。我会为您提供更新:) 如果我错过了什么,请告诉我。
  • @vinyllicker,更新了解决方案,让我知道它是如何为你工作的。
  • 好人,也是一个有效的答案。我已经使用上面的你和我的数据测试了我的数据,并且都以相似的速度工作。感谢您的帮助。
【解决方案2】:

我找到了解决方案,当然我之前尝试过,但突然就奏效了。这是最终的答案。

SELECT a. *
FROM wp_posts AS a
   INNER JOIN (
      SELECT post_title, MIN( id ) AS min_id
      FROM wp_posts
      WHERE post_type = 'track'
      AND post_status = 'publish'
      AND post_date > subtime(now(),'0:30:0')
      GROUP BY post_title
      HAVING COUNT( * ) > 1
   ) AS b ON b.post_title = a.post_title
AND b.min_id <> a.id
AND a.post_type = 'track'
AND a.post_status = 'publish'
AND a.post_date > subtime(now(),'0:30:0');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    相关资源
    最近更新 更多