返回一列上具有最高值的行,该列对应于另一列中的给定值

时间:2015-05-07 04:40:50

标签: mysql greatest-n-per-group

有一个名为 raw_contacts 的MySQL表,其结构如下:

ID (primary auto-increment, int)
PHONE (composite unique with NAME, varchar)
NAME (composite unique with PHONE, varchar)
FREQUENCY (int)
Composite unique key is named PHONENUM

我正在尝试编写一个查询,以便为FONE的任何给定值返回FREQUENCY列中具有最高对应值的行。我确实找到了related post但是接受的答案对我的情况不起作用,因为我有两列的复合键来运行检查。

为了说明,请考虑以下示例:

1 1234 John 6
2 1234 Dave 2
3 2199 Bill 9
4 1878 Dani 3
5 1234 Cory 7
6 1234 Gore 5
7 3319 Cory 1

在上面的示例中针对1234运行,查询应返回第5行,因为Cory在该数字的FREQUENCY列中具有最高计数。

以下是我提出的内容,效果很好:

select RC.ID, RC.PHONE, RC.FREQUENCY, RC.NAME
from `raw_contacts` RC
inner join(
    select PHONE, max(FREQUENCY) FREQUENCY
    from `raw_contacts`
    where PHONE="11111"
    group by PHONE
) RC2 on RC.PHONE = RC2.PHONE and RC.FREQUENCY = RC2.FREQUENCY
limit 1

对于此任务是否有任何更加资源友好的查询,因为它需要在具有数百万条记录的表上以非常高的频率运行?我正在寻求优化骨头!

P.S。如果有多行合格,我只需要其中一行,哪一行无关紧要。

1 个答案:

答案 0 :(得分:1)

join是一个昂贵的DB操作,我认为你必须尽可能避免使用它!我建议使用以下查询并将其结果与您的结果进行比较。

select * from `raw_contacts` RC1 where PHONE="11111" 
and FREQUENCY>=all (select FREQUENCY from `raw_contacts` RC2 where RC2.PHONE=RC1.PHONE) LIMIT 1

您还可以在桌面上考虑不同类型的索引(a good toturial is here),以加快特殊和更频繁的查询