CREATE TABLE IF NOT EXISTS `result` (
`lead_id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(150) NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`lead_id`),
UNIQUE KEY `lead_id` (`lead_id`),
KEY `email` (`email`),
KEY `active` (`active`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
INSERT INTO result (email, active) VALUES
('aaa@xxx.com', 1),
('aaa@xxx.com', 0),
('aaa@xxx.com', 0),
('aaa@xxx.com', 1),
('bbb@xxx.com', 1),
('bbb@xxx.com', 1),
('bbb@xxx.com', 0);
lead_id | email | active
---------------------------
1 | aaa@xxx.com | 1
2 | aaa@xxx.com | 0
3 | aaa@xxx.com | 0
4 | aaa@xxx.com | 1
5 | bbb@xxx.com | 1
6 | bbb@xxx.com | 1
7 | bbb@xxx.com | 0
我需要更新表格,以便只有一行或任何一组匹配的电子邮件地址处于事件状态
我正在努力编写查询来执行此操作。哪一行都没有关系。结果看起来像这样
lead_id | email | active
---------------------------
1 | aaa@xxx.com | 1
2 | aaa@xxx.com | 0
3 | aaa@xxx.com | 0
4 | aaa@xxx.com | 0
5 | bbb@xxx.com | 1
6 | bbb@xxx.com | 0
7 | bbb@xxx.com | 0
谢谢你的建议
最佳答案
对于任何没有最小值的 lead_id
/email
组,以下方法将 active
设置为 0
lead_id
值并且也处于事件状态。 GROUP BY
子查询将有两条记录使用您的示例数据,lead_id
值为 1
和 5
。然后将 result
表连接到此表,任何不匹配子查询的记录都将其 active
值设置为 0
。这没关系,因为该值已经是 0
,或者它是我们希望删除的副本。
UPDATE result AS r1
LEFT JOIN
(
SELECT MIN(lead_id) AS min_lead_id, email, active
FROM result
WHERE active = 1
GROUP BY email, active
) AS r2
ON r1.lead_id = r2.min_lead_id AND r2.email = r2.email
SET r1.active = 0
WHERE r2.active IS NULL
关于php - 在 MySQL 中更新重复记录(仅限第一个 mtch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37803874/