Return 行中一列中的最大值对应于另一列中的给定值

Return rows with the highest value on one column corresponding to a given value in another

有一个名为 raw_contacts 的 MySQL table 具有以下结构:

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

我正在尝试针对 PHONE 的任何给定值,针对 FREQUENCY 列中具有最高对应值的行编写查询 return。我确实找到了一个 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,查询应该 return 第 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

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

P.S. 如果超过一行符合条件,我只需要其中一行,哪一行并不重要。

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

您还可以考虑在 table 上使用不同类型的索引 (a good toturial is here) 以加速特殊和更频繁的查询