2014-10-28 78 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