2012-03-14 70 views
0

所以我有一個計算之間的兩個用戶的評價Pearson相關下面的SQL代碼:如何把SQL查詢到SQL函數

select @u1avg:=avg(user1_rating), 
    @u2avg:=avg(user2_rating), 
    @u1sd:=stddev(user1_rating), 
    @u2sd:=stddev(user2_rating) 
    from 
(select r1.userId as User1_id,r1.rating as User1_rating, 
     r2.userId as User2_id,r2.rating as User2_rating 

from mydb.ratings r1 join mydb.ratings r2 on r1.itemId = r2.itemid 
where r1.userId=1 and r2.userId=2) sample; 


select (1/(count(r1.rating-1)))*sum((([email protected])/@u1sd)*(([email protected])/@u2sd))*(count(r1.rating)/(1+count(r1.rating))) 

from mydb.ratings r1 join mydb.ratings r2 on r1.itemId = r2.itemid 
where r1.userId=1 and r2.userId=2; 

我願把它轉換成一個函數,例如科爾(A ,B) 任何幫助將是有益的。

我得到的問題是,它說:樣品說不準或類似的東西,但是如果我刪除樣品我得到一個錯誤說每個表都必須有別名。

回答

1

我覺得你可以不設在第一個查詢派生表,會看到過那個特定的錯誤 -

SELECT 
    @u1avg:=avg(r1.rating), 
    @u2avg:=avg(r2.rating), 
    @u1sd:=stddev(r1.rating), 
    @u2sd:=stddev(r2.rating) 
FROM mydb.ratings r1 
INNER JOIN mydb.ratings r2 
    ON r1.itemId = r2.itemId 
WHERE r1.userId=1 
AND r2.userId=2; 

SELECT (1/(COUNT(r1.rating-1)))*SUM((([email protected])/@u1sd)*(([email protected])/@u2sd))*(COUNT(r1.rating)/(1+COUNT(r1.rating))) 
FROM mydb.ratings r1 
INNER JOIN mydb.ratings r2 
    ON r1.itemId = r2.itemid 
WHERE r1.userId=1 
AND r2.userId=2;