mysql - 选择重复项并保留最旧的(不基于 ID)

标签 mysql duplicates postfix-mta

感谢您的帮助,我陷入了这个问题。

让我解释一下,我有这样的表:

| domain |     creationdate    | value 1 | value 2 |
|--------|---------------------|---------|---------|
| abc    | 2013-05-28 15:35:01 | value 1 | value 2 |
| abc    | 2013-04-30 12:10:10 | value 1 | value 2 |
| aaa    | 2011-04-02 13:10:10 | value 1 | value 2 |
| bbb    | 2012-02-12 10:48:10 | value 1 | value 2 |
| bbb    | 2013-04-15 07:15:23 | value 1 | value 2 |

我想选择(使用子查询)这个:

| domain |     creationdate    | value 1 | value 2 |
|--------|---------------------|---------|---------|
| abc    | 2013-04-30 12:10:10 | value 1 | value 2 |
| aaa    | 2011-04-02 13:10:10 | value 1 | value 2 |
| bbb    | 2012-02-12 10:48:10 | value 1 | value 2 |

我尝试将子查询与 WHERE 子句中的 IN/NOT IN 和 group by/having 进行组合,但我无法获得正确的结果。

我还有另一个问题要问,如果有人已经遇到过此类问题,我很高兴听到他是如何解决这个问题的。

您在上面看到的第一个表中的记录经常(每十分钟)删除/插入。我的目标是制作结果的副本(或者可能是 View )(没有重复的条目),该副本将由 postfix 邮件服务器 24/7 使用。我听说大 View (带有许多子查询)会降低性能,这意味着表将是更好的选择。问题是,如果我必须每十分钟创建一个新表,就会有一点停机时间,并且 postfix 将无法读取该表。

等待您的建议,谢谢。

编辑:

根据@Ed Gibbs 的回答,有一个更好的示例:

源表:

| domain     |     creationdate    | value 1 | value 2 |
|------------|---------------------|---------|---------|
| google.com | 2013-05-28 15:35:01 | john    | mary    |
| google.com | 2013-04-30 12:10:10 | patrick | edward  |
| yahoo.fr   | 2011-04-02 13:10:10 | britney | garry   |
| ebay.com   | 2012-02-12 10:48:10 | harry   | mickael |
| ebay.com   | 2013-04-15 07:15:23 | bill    | alice   |

您的查询结果是源表。

期望的结果:

| domain     | value 1 | value 2 |
|------------|---------|---------|
| google.com | patrick | edward  |
| yahoo.fr   | britney | garry   |
| ebay.com   | harry   | mickael |

我想保留最旧的域(具有最短创建日期)及其自己的值 1 和 2。

<小时/>

新问题!

我根据您的回答查看了所需的结果。

结果如下所示:

| domain     | value 1 | foreign_key |
|------------|---------|-------------|
| google.com | patrick | X           |
| yahoo.fr   | britney | Y           |
| ebay.com   | harry   | Z           |

我还有一个包含此类条目的表格:

| email              | value 1 | foreign_key |
|--------------------|---------|-------------|
| john@google.com    | patrick | X           |
| john@google.com    | britney | Y           |
| harry@google.com   | mary    | X           |
| mickael@google.com | jack    | X           |
| david@ebay.com     | walter  | Z           |
| alice@yahoo.com    | brian   | Y           |

假设(在此示例中)来自 Yforeign_key 的电子邮件 %@google.com 不是好的记录(只有来自 Xforeign_key 的 %google.com 才是好的记录,而且因为它的域名是我根据创建日期选择的域名)选择)我如何才能仅选择新 View 中引用的域/fk 中的电子邮件?

期望的结果:

| email              | value 1 | foreign_key |
|--------------------|---------|-------------|
| john@google.com    | patrick | X           |
| harry@google.com   | mary    | X           |
| mickael@google.com | jack    | X           |
| david@ebay.com     | walter  | Z           |
| alice@yahoo.com    | brian   | Y           |

我尝试使用 CONCAT('%','@',domain) 和foreign_key=foreign_key 连接,但它没有给我我想要的。

最佳答案

根据您的示例数据和结果,GROUP BY 将为您提供所需的结果:

SELECT
  domain,
  MIN(creationdate) AS creationdate,
  value1,
  value2
FROM mytable
GROUP BY domain, value1, value2
<小时/>

附录:@Arka 提供了更新的示例数据,其中 value 1value 2 列具有不同的值(在原始数据中,它们是相同的)。这会将查询更改为:

SELECT domain, creationdate, value1, value2
FROM mytable
WHERE (domain, creationdate) IN (
  SELECT domain, MIN(creationdate)
  FROM mytable
  GROUP BY domain)

子查询获取每个的最早creationdate的列表,外部查询仅选择domain所在的行>creationdate 与子查询值匹配。

关于mysql - 选择重复项并保留最旧的(不基于 ID),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16799799/

相关文章:

ubuntu - Postfix 不转发,只是将电子邮件存储在用户帐户中

python - 发送电子邮件时 Postfix 挂起

php - 用表格中的 Logo 替换团队名称

java - 如何处理重复的 block

java - Android 应用程序部署在 Eclipse 上创建重复项

C# - 合并两个行重复的数据表

mysql - 非空困惑

mysql - 提高查询性能

php - Cookie token 与数据库不匹配

Python 解决方案允许通过电子邮件将照片上传到我的 Django 网站