寻找使用HAVING过滤的GROUP行的低占用空间解决方案

时间:2019-04-02 09:58:31

标签: mysql

这是一张桌子

id    date     name
1     180101      josh
2     180101      peter
3     180101      julia
4     180102      robert
5     180103      patrick
6     180104      josh
7     180104      adam

我需要获取所有与'josh'日子相同的名字。如何在不将整个表分组的情况下实现它。我需要保持它的效率(这不是我的真实表,我只是在这里简化了我的问题,并且我有成千上万的记录,并且99%的行具有不同的日期,因此按日期分组的行很少见)。

所以基本上我想要的是:如果目标是“乔什”,我需要得到“乔什,彼得,朱莉娅,阿达姆”(实际上前10个不同的名称与乔什共享同一日期)。

SELECT  
    COUNT(date) as datecount,
    GROUP_CONCAT(DISTINCT name) as names,  
FROM  
    table 
GROUP BY  
    date
HAVING 
     datecount>1
     // && name IN ('josh') would work nice for me, but im getting error because 'name' is not in GROUPED BY
LIMIT 10

有什么主意吗?正如我提到的,它需要快速,并且大多数行都有唯一的日期

1 个答案:

答案 0 :(得分:1)

将表本身加入date上:

select distinct t1.name
from tbl t1
join tbl t2 using (date)
where t2.name = 'josh'

Demo

为了获得最佳性能,您应该在(name)(date, name)上建立索引。