问题:我有一个姓名和地址列表。一些名字(人)与其他名字(街道,邮政编码,城镇)具有相同的地址。我想选择所有出现的地址不超过三个的名称,并从其余三个名称中选择前三个名称,每个名称都指向同一地址。例子:
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解决方案感兴趣。
您可以尝试类似
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