gpt4 book ai didi

Mysql在单个查询中删除重复记录

转载 作者:太空宇宙 更新时间:2023-11-03 10:52:04 25 4
gpt4 key购买 nike

我有下表:

CREATE TABLE `relations` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`relationcode` varchar(25) DEFAULT NULL,
`email_address` varchar(100) DEFAULT NULL,
`firstname` varchar(100) DEFAULT NULL,
`latname` varchar(100) DEFAULT NULL,
`last_contact_date` varchar(25) DEFAULT NULL,
PRIMARY KEY (`id`)
)

在此表中有重复项,这些是具有完全相同的关系代码和电子邮件地址的关系。他们可以在那里两次甚至十次。我需要一个查询来选择所有记录的 id,但排除其中不止一次的记录。在这些记录中,我只想选择具有最新 last_contact_id 的记录。

我更喜欢 Oracle 而不是 Mysql,在 Oracle 中我可以这样做:

select * from (
select row_number () over (partition by relationcode order by to_date(last_contact_date,'dd-mm-yyyy')) rank,
id,
relationcode,
email_address ,
last_contact_date
from RELATIONS)
where rank = 1

但我不知道如何修改此查询以在 MySql 中工作。我什至不确定是否可以在 MySQl 中的单个查询中执行相同的操作。有什么想法吗?

最佳答案

执行此操作的常规方法是使用子查询获取最新记录,然后将其与表连接:-

SELECT id, relationcode, email_address, firstname, latname, last_contact_date
FROM RELATIONS
INNER JOIN
(
SELECT relationcode, email_address, MAX(last_contact_date) AS latest_contact_date
FROM RELATIONS
GROUP BY relationcode, email_address
) Sub1
ON RELATIONS.relationcode = Sub1.relationcode
AND RELATIONS.email_address = Sub1.email_address
AND RELATIONS.last_contact_date = Sub1.latest_contact_date

可以使用变量手动生成您的 Oracle 查询使用的排名类型。虽然有点乱!

SELECT id, relationcode, email_address, firstname, latname, last_contact_date
FROM
(
SELECT id, relationcode, email_address, firstname, latname, last_contact_date, @seq:=IF(@relationcode = relationcode AND @email_address = email_address, @seq + 1, 1) AS seq, @relationcode := relationcode, @email_address := email_address
(
SELECT id, relationcode, email_address, firstname, latname, last_contact_date
FROM RELATIONS
CROSS JOIN (SELECT @seq:=0, @relationcode := '', @email_address :='') Sub1
ORDER BY relationcode, email_address, last_contact_date DESC
) Sub2
) Sub3
WHERE seq = 1

这使用子查询来初始化变量。如果关系代码和电子邮件地址与上一行相同,则添加序列号,否则将它们重置为 1 并存储在字段中。然后外层选择检查序列号(作为一个字段,而不是作为变量名),只有当它是 1 时才返回记录。

请注意,我已将此作为多个子查询完成。部分是为了让您更清楚,但也是为了强制执行 MySQL 的执行顺序。 MySQL 表示它可能会命令执行可能导致问题的事情的方式有几个可能的问题。他们从来没有为我做过,但我希望通过子查询强制执行命令。

关于Mysql在单个查询中删除重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23951333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com