2012-02-15 102 views
1

我真的被卡住了,並且一直在尋找一段時間,但沒有成功。通過循環變量對循環或SQL查詢進行排序變量

無論如何,我有這個公式稱爲貝葉斯估計:(WR)=(V÷(V + M))×R +(M÷(V + M))×C

我有三個數據庫表:人員,評論,評級。

個人表是很基本的,但對這個問題的緣故,它只有一個字段:ID

reviews表已經ID,PERSONID,說明其中PERSONID是對的ID人。

該收視表具有id,personID,reviewID,ratingX,ratingY,ratingZ其中person是該人的ID並且reviewID是該評論的ID。 ratingX/Y/Z是該人的三種不同的評分,並且在我的頁面中顯示了這三個數字的平均值。

然而,表格列出他們,然而,按貝葉斯估計公式排序它們。我不知道如何做到這一點,看起來超出了我的想法,因爲您無法訂購$ bayesian_formula或類似的東西。該腳本看起來是這樣的:

<?php 
$result = $db->query("SELECT * FROM persons"); 
$m =; //SQL to get average number of reviews of all persons 
$c =; //SQL to get average rating of all persons 
while($row = $result->fetch_array()){ 

$r =; //SQL to get average ratings of person 
$v =; //SQL to get total number of reviews of person 

$formula = ($v/($v+$m)) * $r + ($m/($v+$m)) * $c; 

$result2 = $db->query("SELECT * FROM ratings ORDER BY $formula"); 
    while($row2 = $result2->fetch_array()){ 

    $result3 = $db->query("SELECT * FROM persons WHERE id='$row2[person]'"); 
    $row3 = $result3->fetch_array(); 

    echo $row2['description']."<br> rating: ".round(($row['ratingX'] + $row['ratingY'] + $row['ratingZ'])/3); 

    } 

} 
?> 

$公式循環到數據庫結果的加權評分的每個迭代。

顯然這是不正確的。我將如何完成這項工作?我需要修改我的整個腳本嗎?實際的一個更長,更詳細。

編輯:

sql語句是:

$c_query=$db->query("SELECT ((ratingX + ratingY + ratingZ)/3) as avg_rate FROM ratings"); 
$c_ = $c_query->fetch_array(); 
$c = $c_['avg_rate']; 

$m_query=$db->query("SELECT COUNT(id) AS count FROM ratings"); 
$m_ = $m_query->fetch_array(); 
$m = $m_['count']; 

$v_query=$db->query("SELECT COUNT(id) AS count FROM ratings WHERE person='$row[id]'"); 
$v_ = $v_query->fetch_array(); 
$v = $v_['count']; 

$r_query=$db->query("SELECT ((ratingX + ratingY + ratingZ)/3) as avg_rate FROM ratings WHERE person='$row[id]'"); 
$r_ = $r_query->fetch_array(); 
$r = $r_['avg_rate']; 
+0

您正在使用哪種RDBMS(Oracle,SQLServer等)? – 2012-02-15 10:44:33

+0

您能否包含用於派生m,c,r和v的SQL?在SQL中導出和排序結果可能會更簡單,更高效,而不是循環遍歷php中的數據集。 – 2012-02-15 10:48:07

+0

將sqls添加到主帖 – user1210725 2012-02-16 01:33:28

回答

0

您可以使用CREATE PROCEDURE

+0

我不明白...我讀過它,您將如何使用它來訂購我的查詢?你能舉個例子嗎? – user1210725 2012-02-15 08:31:27

+0

您將所有內容從PHP移動到存儲過程,然後使用PHP中的'CALL your_procedure_name()'命令來計算您的計算數據。 – 2012-02-15 08:39:56

+0

請給我舉一個例子,說明它至少可以幫助我。這幾乎是SQL的一個功能...這對我來說是一個全新的話題,這就是定義所說的,所以我不明白它有什麼用處。這是暫時的價值嗎?如果是這樣,我該如何使用它,因爲我嘗試$ db-> query(「CREATE ...」);然後$ db-> query(「CALL ...」);但是這並不起作用,如果我使用我的PHPMYADMIN的sql啓動器,它也會返回一個錯誤。是的,我有mysqli的支持。 – user1210725 2012-02-16 01:50:41

-1

假設你正在使用的RDBMS(如Oracle或SQLServer的)支持使用與聚合函數OVER子句,以下查詢應以所需順序返回所需內容:

select * from 
(select r.*, 
     count(r.ID) over()/count(distinct p.ID) over() m, 
     avg(r.ratingX + r.ratingY + r.ratingZ) over()/3 c, 
     avg(r.ratingX + r.ratingY + r.ratingZ) over (partition by p.ID)/3 r, 
     count(r.ID) over (partition by p.ID) v 
from persons p 
left join ratings r on p.ID = r.personID) q 
order by r*v/(v+m) + c*m/(v+m) 

排序表達式可以簡化爲(r * v + c * m)/(v + m)。另外,C *米將在結果集中常數,所以order by表達式可以簡化爲:

order by r*v/(v+m) 

- 然而,完整的表達已保留在查詢清晰度。

+0

請問downvoter是否可以解釋? – 2013-04-15 17:45:26