sql >> Databasteknik >  >> RDS >> Mysql

Hur programmerar man ett röstningssystem?

För det här exemplet, låt oss anta att du röstar på så-svar. Detta kräver minst tre tabeller:

Användare , Svar , röster

Rösttabellen kommer att innehålla all historik:

voteid | userid | answerid | value
----------------------------------
   1   |   12   |   383    |   1
   2   |   28   |   383    |  -1  (negative number would require signed values)

I det här exemplet ser vi att två röster har registrerats. Användare 12 och 28 röstade båda på svar 383. Användare 12 älskade det och lade till 1 till sitt stöd. Användare 28 gillade det inte, och subtraherade 1 från dess stöd.

När en användare röstar bör du först kontrollera om den användaren redan har röstat på just den frågan. Om de har det kan du avvisa ytterligare försök att rösta eller skriva över deras gamla röst med en ny.

SELECT * 
FROM votes 
WHERE (userid = 12) 
  AND (answerid = 383)

Det är en mycket enkel exempelfråga som kommer att berätta om användaren redan har röstat eller inte. Om det ger rekord vet du att de har röstat. Du kan svara med ett mycket trevligt "Förlåt, du har redan röstat." meddelande, eller så kan du skriva över det:

UPDATE votes 
SET value = $votevalue 
WHERE (userid = 12) 
  AND (answerid = 383)

När det är sagt, låt oss titta på hur SO åstadkommer detta:

När du klickar på upp-rösta-pilen avfyrar SO en begäran till en webbadress som följande:

    http://stackoverflow.com/posts/1303528/vote/2

I den här webbadressen kan vi se att omröstningen görs på inlägg #1303528. Och rösttypen representeras av 2. Dessa 2 representerar sannolikt "lägg till en". Du kan använda en mer grundläggande url och gå med något som:

    vote.php?answerid=383&vote=1

Sidan vote.php skulle ha kod som liknar följande:

(varning:använd inte den här koden som den är. Den är tänkt att vara ett exempel, inte en lösning)

if ($_GET) {

  $userid   = $_SESSION["userid"]; // assumes the user is logged in via SESSIONS
  $answerid = $_GET["answerid"];
  $votetype = $_GET["vote"];

  $query = "SELECT * 
            FROM votes 
            WHERE (userid = {$userid}) 
              AND (answerid = {$answerid})";

  $result = mysql_query($query) or die(mysql_error());

  if (mysql_num_rows($result) > 0) {
    # User has voted
    print "Sorry, you are only allowed one vote.";
  } else {
    # User has not voted, cast the vote
    $query = "INSERT INTO votes (userid, answerid, votevalue)
              VALUES({$userid},{$answerid},{$vote})";
    $result = mysql_query($query) or die(mysql_error());
    if (mysql_affected_rows($result) > 0) {
      print "Your vote has been recorded.";
    }
  }

}


  1. SQL-punktnotation

  2. SQL för att ignorera rader som har en viss egenskap från en sammanfogad tabell

  3. PostgreSQL Performance - SELECT vs lagrad funktion

  4. EBS 12.2.5 och högre:Feljustering av inloggningssidans knapp