一尘不染

如何将SQL结果集限制为不太常见的项目

sql

问题:我有一个姓名和地址列表。一些名字(人)与其他名字(街道,邮政编码,城镇)具有相同的地址。我想选择所有出现的地址不超过三个的名称,并从其余三个名称中选择前三个名称,每个名称都指向同一地址。例子:

Albert | Adr1
Berta  | Adr1
Cesar  | Adr1
Donald | Adr1
Eric   | Adr2
Fritz  | Adr2
Gerd   | Adr2
Henry  | Adr3

结果集应为

Albert | Adr1 
Berta  | Adr1
Cesar  | Adr1
Eric   | Adr2
Fritz  | Adr2
Gerd   | Adr2
Henry  | Adr3

唐纳德(Donald)失踪是因为他是地址相同的小组的第四名。可以通过UNION和子查询实现此结果吗?就像是

select * from addresses where address in 
(select address from addresses group by address having count(address) <= 3)
UNION
select * from addresses where address in 
(select address from addresses group by address having count(address) > 3 limit 3)

我知道此查询是错误的,因为它限制了出现3次以上的地址的完整结果集。我想知道是否可以在带有UNION和子查询的单个SELECT中完成。我现在将使用PHP /
MySQL进行程序上的操作,但只是出于娱乐目的,将对仅SQL解决方案感兴趣。


阅读 196

收藏
2021-03-08

共1个答案

一尘不染

您可以尝试类似

SELECT  PersonName,
        Address
FROM    (
            SELECT  *,
                    (SELECT COUNT(1) FROM addresses WHERE Address = a.Address AND PersonName < a.PersonName) CountLess
            FROM    addresses a
        ) sub
WHERE   sub.CountLess <= 2
2021-03-08