2012-02-15 101 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