最近1000条记录的比较查询

时间:2014-10-28 21:46:05

标签: mysql sql cursor query-optimization

我希望根据最近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)返回一条记录的选项是什么,目标是将此结果转储到另一个表中?我可以看到在夜间批处理作业中使用嵌套游标,但我希望有更高效的东西。

1 个答案:

答案 0 :(得分:0)

您可以使用排名变量为每个用户创建最后1,000个操作的表,然后使用group by来比较每个用户。注意底部的where条件,以确保不重复比较。

关于效率的说明:原始问题中的查询大约需要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
相关问题