2013-04-20 32 views
1

在我目前正在使用的網站上,有一個與本網站上的評分系統相似的評分系統,每個客戶可以累積'分數'或'星星」。在MySql中使用變量來計算用戶對數字標量的評分

現在我正在開發一個自動發送電子郵件系統,它將發送我所有用戶的 前5名單和他們的分數,並與前5名單一起發送,也是收件人用戶的個人分數。

現在,由於這是服務器上的例行任務(cronjob),效率方面非常重要,我使用mySql變量來獲得每個用戶的評分。

我想使用相同的查詢來獲得其他用戶和他的評級(即使他在100位),但由於某種原因,我沒有得到正確的結果。

工作代碼:

private function getTopStars($adminId){ 
     try{ 
      $conn = DBLink::getInstance(); 
      $query = "SELECT @rownum:[email protected]+1 AS rank, u.user_id, u.contact_name AS name, p.points FROM scores p, (SELECT @rownum:=0) r, users u WHERE u.stars_enabled = 1 and u.user_id=p.user_id and p.admin_id = :admin_id AND u.user_id <> :adminId ORDER BY points DESC"; 
      $sth = $conn->prepare($query); 
      $sth->bindParam(':adminId', $adminId, PDO::PARAM_INT); 
      $sth->execute(); 
      $topStars = $sth->fetchAll(PDO::FETCH_ASSOC); 
      $html = ''; 
      foreach($topStars as $topStar){ 
       $html .= " <div class='score'> 
         <div style='float:left;padding:2px;' class='rank'> " . 
         $topStar['rank'] . "# </div><div style='float:left;padding:2px;font-size: 12px;'>" . $topStar["name"] . " </div><div style='float:left;padding:2px;font-size: 11px;'> (" . $topStar["points"]. " <img src='http://mydev.com/images/star_icon.jpg' />)</div></div><br style='clear:both;'/>"; 
      } 
      return $html; 

     } 
     catch(PDOException $err){...} 
} 

是拒絕工作的加成:

private function getTopStars($adminId, $userId){ 
     try{ 
      $conn = DBLink::getInstance(); 
      $query = "SELECT @rownum:[email protected]+1 AS rank, u.user_id, u.contact_name AS name, p.points FROM scores p, (SELECT @rownum:=0) r, users u WHERE u.stars_enabled = 1 and (u.user_id=p.user_id and p.admin_id = :admin_id) OR (u.user_id = :uid) AND u.user_id <> :adminId ORDER BY points DESC"; 
      $sth = $conn->prepare($query); 
      $sth->bindParam(':adminId', $adminId, PDO::PARAM_INT); 
      $sth->bindParam(':uid', $userId, PDO::PARAM_INT); 
      $sth->execute(); 
      $topStars = $sth->fetchAll(PDO::FETCH_ASSOC); 
      $html = ''; 
      foreach($topStars as $topStar){ 
       $html .= " <div class='score'> 
         <div style='float:left;padding:2px;' class='rank'> " . 
         $topStar['rank'] . "# </div><div style='float:left;padding:2px;font-size: 12px;'>" . $topStar["name"] . " </div><div style='float:left;padding:2px;font-size: 11px;'> (" . $topStar["points"]. " <img src='http://mydev.com/images/star_icon.jpg' />)</div></div><br style='clear:both;'/>"; 
      } 
      return $html; 

     } 
     catch(PDOException $err){...} 
} 

,如果我不能讓它以這種方式工作,我唯一能做的事情,就是實現另一種私人方法,它將獲取每個用戶的個人信息, 使用分組和數學sql函數在分數表中獲得他的評分,這被認爲是浪費服務器資源。

查詢的邏輯: 我想要接收5位排名最高的用戶,按照他們的位置(使用變量)或我發送當前電子郵件的當前用戶排序和標記,與相同的信息,我想從排名表中排除管理員。 任何想法爲什麼它不工作?我是否需要爲分數列或其他內容編制索引?

在此先感謝您的幫助!

+0

我想我可能會做一個查詢,搶第5個用戶創建一個郵件模板,然後對所有行(不要忘記5首),使用模板並完成用戶詳細信息。一個單一的查詢應該很快。 – didierc 2013-04-20 20:12:34

+0

第二個查詢試圖實現什麼? – didierc 2013-04-20 20:15:11

回答

1

這是你形容爲「工作」

SELECT @rownum:[email protected]+1 AS rank, u.user_id, u.contact_name AS name, p.points 
FROM scores p, (SELECT @rownum:=0) r, users u 
WHERE u.stars_enabled = 1 
    AND u.user_id=p.user_id 
    AND p.admin_id = :admin_id 
    AND u.user_id <> :adminId 
ORDER BY points DESC 

這是你形容爲「不工作」

SELECT @rownum:[email protected]+1 AS rank, u.user_id, u.contact_name AS name, p.points 
FROM scores p, (SELECT @rownum:=0) r, users u 
WHERE u.stars_enabled = 1 
    AND (u.user_id=p.user_id AND p.admin_id = :admin_id) 
    OR (u.user_id = :uid) 
    AND u.user_id <> :adminId 
ORDER BY points DESC 

在MySQL中,選擇「和」具有更高的優先級比選擇「OR」,意思是你的WHERE條件將被評估爲:

(u.stars_enabled = 1 AND u.user_id=p.user_id AND p.admin_id = :admin_id) 
OR 
(u.user_id = :uid AND u.user_id <> :adminId) 

這可能不是你想要的,但我實際上並不瞭解你想達到的目標。

通過您的描述「我想要得到其他用戶....」我只能大膽猜測你實際上想做什麼。第一個查詢(工作)給你一個所有用戶與某個admin_id相關的列表,所以它應該包括你所指的任何「其他用戶」?沒有?

編輯

我想我現在明白你的問題。您正在討論的其他用戶已經是該排名的一部分。你正在試圖做的是一種方法來限制查詢5行 1行爲特定用戶,如果該用戶不是5頂部行的一部分。這可以用一個子查詢來實現:

SELECT * FROM (
    SELECT @rownum:[email protected]+1 AS rank, u.user_id, u.contact_name AS name, p.points 
    FROM scores p, (SELECT @rownum:=0) r, users u 
    WHERE u.stars_enabled = 1 
     AND u.user_id=p.user_id 
     AND p.admin_id = :admin_id 
     AND u.user_id <> :adminId 
    ORDER BY points DESC 
) WHERE rank<=5 or u.user_id=:uid 
+0

好吧,先生,其含義是我想選擇5個不是管理員的最高用戶,也是第6個用戶,實際上是電子郵件收件人,除非他是第5個用戶的一部分。 – 2013-04-21 12:25:47

+0

@OlegTikhonov編輯我的答案根據我認爲你想要做的。 – Hazzit 2013-04-21 12:39:46