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

时间:2013-05-28 19:22:22

标签: 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进行子查询的组合,并按/有组,但是我无法获得正确的结果。

我还有另一个问题要问,如果有人已经遇到过这种问题,我会很高兴听到他如何设法解决这个问题。

您在上面看到的第一个表格中的记录经常(每隔10分钟)被删除/插入。我的目的是制作一个后缀邮件服务器将24/7全天候使用的结果(没有重复条目)的副本(或可能是视图)。我听说大视图(有很多子查询)会降低性能,这意味着表格会是一个更好的选择。问题是,如果我必须每隔十分钟制作一张新表,那么会有一点停机时间,后缀将无法读取该表。

等待你的建议,谢谢。

编辑:

根据@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。


新问题!

我基于你的anwser对所需的结果进行了观察。

结果如下:

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

假设(在此示例中)来自Y foreign_key的电子邮件%@ google.com不是好记录(只有来自X外国的%google.com是好的,也因为它的域名是我选择的创建日期选择)我怎么能设法只选择我在新视图中引用的域/ 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('%','@',域名)和foreign_key = foreign_key加入,但它没有给我我想要的内容。

1 个答案:

答案 0 :(得分:1)

根据您的示例数据和结果,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的列表,外部查询仅选择domaincreationdate匹配子查询值的行。< / p>