2014-10-28 81 views
0

我正在查看基于最近1000条记录的数据库中的用户数据。查询的基本结构如下:最近1000条记录的比较查询

SELECT p.id, p2.id, ROUND(AVG(1000 + ABS(p2.ss - p.ss)/6.1 * -50)) AS sim_score 
FROM 
(SELECT * FROM p WHERE id = 519000 ORDER BY p_date DESC LIMIT 0,1000) p, 
(SELECT * FROM p WHERE id = 279000 ORDER BY p_date DESC LIMIT 0,1000) p2 

在这种情况下,我指定两个用户(519000和279000)。这将返回一个记录与每个ID和相似性分数。我有什么选择为数据库中的每个用户比较(u^2-u)返回一条记录,目标是将此结果转储到另一个表中?我可以看到在夜间批量作业中使用嵌套游标,但我希望有更高效的东西。

回答

0

您可以使用rank变量为每个用户创建最近1,000次操作的表格,然后通过比较每个用户来创建一个group。注意底部的位置条件以确保不会重复您的比较。

关于效率的说明:原始问题中的查询需要大约1秒钟才能执行。添加下列其中一个表时,执行时间需要30分钟。第二张表可能会将查询放大约450分钟(我还没有确认)。所以,当这个答案有效时,我仍然在寻找更快的方法。

SELECT p.id, p2.id, ROUND(AVG(1000 + ABS(p2.ss - p.ss)/6.1 * -50)) AS sim_score FROM 

(SELECT * FROM (
SELECT p.id, 
    (CASE p.id 
    WHEN @curPit 
    THEN @curRow := @curRow + 1 
    ELSE @curRow := 1 AND @curPit := p.id END) AS rank 
FROM pitches p, (SELECT @curRow := 0, @curPit := '') r 
ORDER BY p.id, p.p_date DESC) n WHERE rank <= 1000) p, 

(SELECT * FROM (
SELECT p.id, 
    (CASE p.id 
    WHEN @curPit 
    THEN @curRow := @curRow + 1 
    ELSE @curRow := 1 AND @curPit := p.id END) AS rank 
FROM pitches p, (SELECT @curRow := 0, @curPit := '') r 
ORDER BY p.id, p.p_date DESC) n WHERE rank <= 1000) p2 

WHERE p.id < p2.id 
GROUP BY p.id, p2.id