有一个名为 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。如果有多行合格,我只需要其中一行,哪一行无关紧要。
答案 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),以加快特殊和更频繁的查询