我需要一种更好的方法从我拥有的某些表中检索前10个不同的UID。
设置:
我的目标:
我当前的代码正在运行,但是慢慢地杀死了数据库:
select
distinct uvt.uid as UID,
(select count(*) from user_view_tracker temp where temp.uid=uvt.uid and temp.ts>date_sub(now(),interval 1 month)) as CLICK
from user_view_tracker uvt
order by CLICK
limit 10
很明显,不同的数据结构会有所帮助。但到目前为止,我无法做到这一点。
答案 0 :(得分:1)
尝试:
select uid, count(*) as num_stamps
from user_view_tracker
where ts > date_sub(now(), interval 1 month)
group by uid
order by 2 desc limit 10
我保留了你的标准,直到过去一个月的计数。如果要全部计算,可以删除该行。
删除DISTINCT应该可以提高性能。如果您通过uid在外部查询和组中进行聚合,则没有必要,因为这会将数据聚合到每个uid的一行并带有计数。
答案 1 :(得分:1)
首先,删除该子查询,这应该足够了;)
select
uvt.uid as UID
,count(*) as CLICK
from
user_view_tracker uvt
where
uvt.ts > date_sub(now(),interval 1 month)
group by
uvt.uid
order by CLICK DESC
limit 10
答案 2 :(得分:0)
你应该在MySQL中使用Aggregate functions
SELECT UID, COUNT(ts) as Number_Of_Views FROM user_view_tracker
GROUP BY UID
ORDER BY Number_Of_Views DESC
LIMIT 10
一个简单的演示,选择前10个UID观看
http://sqlfiddle.com/#!2/907c10/3