问题:我有一个姓名和地址列表。有些姓名(人)与其他姓名(街道,邮政编码,城镇)具有相同的地址。我想选择所有出现的地址不超过三个的名称,然后从其余三个名称中选择前三个名称,每个名称指向同一地址。
示例:Albert | Adr1
贝塔| Adr1
塞萨尔| Adr1
唐纳德| Adr1
埃里克| Adr2
弗里茨| Adr2
格尔德Adr2
亨利| Adr3
结果集应为

阿尔伯特| Adr1
贝塔| Adr1
塞萨尔| Adr1
埃里克| Adr2
弗里茨| Adr2
格尔德Adr2
亨利| Adr3

唐纳德(Donald)失踪是因为他是地址相同的小组的第四名。
使用UNION和子查询能否达到此结果?就像是

从地址中选择*
(从地址组中按地址(计数)联盟
从地址中选择*
(从地址组中按地址(计数)> 3限制3的地址选择地址)

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

我查看了SQL query with limit on rows from one table, not the result set,但这不能反映我的情况-是吗?

最佳答案

您可以尝试类似

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

09-11 20:15