2013-01-20 3 views
2

저는 지난 주 내에 MySQL과 PHP를 통해 최고 등급의 사진을 얻으려고합니다. 나는 베이지안식이 내가 필요한 것일지도 모른다는 것을 알았지 만, 나는 아무 쓸모가 없다.0을 반환하는 베이지안 알고리즘

다음 코드는 오류를 반환하지 않으며 '0'만 반환합니다. 왜 그게 내가 가장 사소한 것이 아닌지.

$bayesian_algo = "SELECT 
      photo_id, 
      (SELECT count(photo_id) FROM photo_ratings)/
(SELECT count(DISTINCT photo_id) FROM photo_ratings) AS avg_num_votes, 
      (SELECT avg(rating) FROM photo_ratings) AS avg_rating, 
      count(photo_id) as this_num_votes, 
      avg(rating) as this_rating 
      FROM photo_ratings 
      WHERE `date` > '$timeframe' 
      GROUP BY photo_id"; 

$bayesian_info = $mysqli->query($bayesian_algo); 

$all_bayesian_info = array(); 
while($row=$bayesian_info->fetch_assoc()) array_push($all_bayesian_info,$row); 

list($photo_id,$avg_num_votes,$avg_rating,$this_num_votes,$this_rating) = $all_bayesian_info; 
$photo_id = intval($photo_id); 
$avg_num_votes = intval($avg_num_votes); 
$avg_rating = intval($avg_rating); 
$this_num_votes = intval($this_num_votes); 
$this_rating = intval($this_rating); 

$bayesian_result = (($avg_num_votes * $avg_rating) + ($this_num_votes * $this_rating))/($avg_num_votes + $this_num_votes); 

echo $bayesian_result; // 0?? 

내 데이터베이스는 다음과 같습니다 : 모든 필드 (나는 유닉스 타임 스탬프로 날짜를 저장하고있어)의 INT로 저장됩니다

photo_id | user_id | rating | date 

.

내가 피곤하고 무모하게 코딩 해요는, 일반적으로 나는 적어도 오류 메시지가 있다면 조금 더 얻을 수 (또는 아무것도!)하지만, 내가 할 데이터가 내가 var_dump($all_bayesian_info) 지금까지 반환하면 방법이 없습니다 수 0

+0

어쩌면 이전 잘못입니까? – wildplasser

답변

2

mysql 쿼리 자체에서 복잡한 베이지안 계산을 할 수 있습니다!.

코드는 다음과 같이 쓸 수있다 :

$bayesian_algo_result = "SELECT *, 
(((resultdata.avg_num_votes * resultdata.avg_rating) + (resultdata.this_num_votes * resultdata.this_rating))/(resultdata.avg_num_votes + resultdata.this_num_votes)) AS bayesian_result 
FROM 
( 
SELECT 
    photo_id, 
    (SELECT count(photo_id) FROM photo_ratings)/
     (SELECT count(DISTINCT photo_id) FROM photo_ratings) AS avg_num_votes, 
    (SELECT avg(rating) FROM photo_ratings) AS avg_rating, 
    count(photo_id) as this_num_votes, 
    avg(rating) as this_rating  
FROM photo_ratings 
WHERE `date` > '$timeframe' 
GROUP BY photo_id 
) AS resultdata; 
"; 

$bayesian_result_info = $mysqli->query($bayesian_algo_result); 

//loop through the rows. 
while($row = $bayesian_result_info->fetch_assoc()) { 
    list(
     $photo_id, 
     $avg_num_votes, 
     $avg_rating, 
     $this_num_votes, 
     $this_rating, 
     $bayesian_result 
    ) = $row; 

    echo 'Balesian rating for photo' . $photo_id . ' is: ' . $bayesian_result; 
} 

참고 :

  • 여기

    작업 SQL 바이올린입니다 : http://sqlfiddle.com/#!2/d4a71/1/0

  • 내가 수식에 대한 로직 변경 didnot은 . 따라서 수식이 올바른지 확인하십시오.

  • UNIX 타임 스탬프가 64 비트 데이터 유형으로 전환되는 경우 MySQL의 "bigint"를 사용하여 '날짜'열에 저장해야합니다.
+1

안녕하세요. @Jaxo 님이 도움이되는지 알려주세요. – OMG

+0

분명히, 나는 내 작업 컴퓨터에 올라 타면 그것을 시도 할 것이다! 고마워! – Scott

+0

완벽하게 작동합니다. 대단히 감사합니다! 나는 그것을 약간 수정하여 베이지안 결과에 따라 명령을 내리고 결과를 '결과 데이터 ORDER BY bayesian_result DESC;'로 변경했습니다. – Scott

관련 문제