2013-03-15 117 views
-3

我有這樣的.PHP,我都數不過來從數據庫票制 - 計數最大投票

SELECT std.fname, std.lname, COUNT(v.cand_id) 
FROM vote v, student std, candidate ca, position pos 
WHERE v.cand_id = ca.stud_id AND ca.pos_id = 1 AND ca.stud_id = std.id 
最大投票

的問題是,計數是關閉的,它顯示了70票,而當我算它在數據庫上只有11票。我認爲這是計算所有選票而不是COUNT(v.cand_id)上的特定人員。

此表是關於計算投票數並顯示獲得投票的最高人選。

$ que1 = mysql_query($ sql1,$ con);

while($row1 = mysql_fetch_array($que1)) 
     { 


      echo "President: "; echo "".$row1['fname']; echo " ".$row1['lname']; echo " having ".$row1['v.cand_id']; echo " votes"; 

      echo "<br>";  
     } 
+1

'從投票v,學生std ...'給你一個所有表的交叉產品!使用[MySQL連接](http://dev.mysql.com/doc/refman/5.0/en/join.html) – mavili 2013-03-15 02:08:54

回答

2

試試這個:

SELECT 
    std.fname, 
    std.lname, 
    COUNT(v.cand_id) TotalVotes 
FROM vote   AS v 
INNER JOIN candidate AS ca ON v.cand_id = ca.stud_id 
INNER JOIN student AS std ON ca.stud_id = std.id 
INNER JOIN position AS pos ON ca.pos_id = pos.id 
WHERE ca.pos_id = 1 
GROUP BY std.fname, 
     std.lname; 

這將點票爲每個用戶。

要僅顯示誰得到了總票數最高的人,試試這個:

SELECT 
    std.fname, 
    std.lname, 
    COUNT(v.cand_id) TotalVotes 
FROM vote   AS v 
INNER JOIN candidate AS ca ON v.cand_id = ca.stud_id 
INNER JOIN student AS std ON ca.stud_id = std.id 
INNER JOIN position AS pos ON ca.pos_id = pos.id 
WHERE ca.pos_id = 1 
GROUP BY std.fname, 
     std.lname 
ORDER BY TotalVotes DESC 
LIMIT 1; 

注意事項:

  • 請儘量避免老用WHERE連接語法子句的方式,並開始使用顯式ANSI-92連接語法。在您發佈的查詢中,您加入WHERE子句中的表,但對於表position pos,沒有加入條件,這可能是您獲取不正確數據的原因,因爲在這種情況下,它正在交叉連接兩個表代替。

  • 另外,儘量避免對不在聚合函數中的列使用聚合函數,而不使用GROUP BY子句作爲你的做法,它將適用於MySQL,但這是一個很好的做法。 。

+0

對不起,我忘了添加這個,我用這個.php文件 – user2172157 2013-03-15 02:20:08

+0

@ user2172157 - 確定,只需在你的php代碼中用你的查詢替換你正在使用的查詢。 – 2013-03-15 02:25:02

+0

回覆「總統:我用'TotalVotes'」; echo「」。$ row1 ['fname']; echo「」。$ row1 ['lname']; echo「having」。$ row1 ['TotalVotes'];回聲「投票」;它只顯示Person ABC擁有「1」票,它只顯示1票 – user2172157 2013-03-15 02:46:26