【发布时间】:2020-10-20 03:01:14
【问题描述】:
所以这可能很简单,但我正在努力寻找一种有效的方法来做到这一点。我查看了许多其他问答,我已经搞砸了 DISTINCT、GROUP BY、子查询等。
我试图超级简化这个例子。 (出于示例的目的,没有 DB 规范化)这是一个 SQL 小提琴:
http://sqlfiddle.com/#!9/948be7c/1
CREATE TABLE IF NOT EXISTS `orders` (
`id` int NOT NULL,
`name` varchar(90) NULL,
`email` varchar(200) NULL,
`phone` varchar(200) NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `orders` (`id`, `name`, `email`, `phone`) VALUES
('1', 'Bob', 'bob@email.com', NULL),
('2', 'Bobby', 'bob@email.com', '1115551111'),
('3', 'Robert', 'robert@email.com', '1115551111'),
('4', 'Fred', 'fred@email.com', '1115552222'),
('5', 'Freddy', 'fred@email.com', '1115553333')
如果我只是运行一个简单的选择,我会得到:
但我想对具有相同电子邮件地址或具有相同电话号码的任何结果“去重” - 因为他们将是同一个人,即使他们有多个 ID,即使他们他们的名字拼写不同。然后合并这些结果(“不同的”电子邮件地址之一和“不同的”电话号码之一以及姓名之一和 ID 之一。)
因此,对于上述内容,我最终会得到这样的结果:
有什么建议吗?
【问题讨论】:
-
什么决定了为重复返回哪个 id/name?
-
一开始为什么会有重复数据?您应该规范化您的数据库,以便所有客户信息都在另一个表的一行中,并且
order表具有customer表的外键。 -
我尝试了 DISTINCT 和 GROUP BY 的多种变体,但没有得到我想要的。 (而且我的实际数据库要复杂得多,所以这些查询不相关。)
-
哪个 ID / 名字真的不重要。只需成为与电子邮件和电话匹配的其中之一即可。
-
您必须选择一组列作为分组依据。我认为没有任何方法可以按一组可变的列进行分组。
标签: mysql sql select duplicates greatest-n-per-group