在我目前正在使用的網站上,有一個與本網站上的評分系統相似的評分系統,每個客戶可以累積'分數'或'星星」。在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位排名最高的用戶,按照他們的位置(使用變量)或我發送當前電子郵件的當前用戶排序和標記,與相同的信息,我想從排名表中排除管理員。 任何想法爲什麼它不工作?我是否需要爲分數列或其他內容編制索引?
在此先感謝您的幫助!
我想我可能會做一個查詢,搶第5個用戶創建一個郵件模板,然後對所有行(不要忘記5首),使用模板並完成用戶詳細信息。一個單一的查詢應該很快。 – didierc 2013-04-20 20:12:34
第二個查詢試圖實現什麼? – didierc 2013-04-20 20:15:11