-2

私はデータベースから最大投票数を数えなければならないこの.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>";    
        }
4

1 に答える 1

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には結合条件がありませんでした。これが、誤ったデータを取得していた理由である可能性があります。この場合、代わりに 2 つのテーブルをクロス結合していたためです。

  • また、集約関数に含まれていない列で集約関数を使用GROUP BYしないようにしてください。これは、MySQL で機能しますが、これを行うことをお勧めします。

于 2013-03-15T02:09:35.480 に答える