MySQL获得前三名,并给予不同的奖励

时间:2015-06-27 16:15:47

标签: php mysql

我遇到了问题。

    <?php
    include "base.php";
    $result = mysql_query("SELECT * FROM users WHERE Score > 0 ORDER BY Score DESC LIMIT 3");
    while ($row = mysql_fetch_array($result))
    {
    $name = $row['Name'];
    echo $name;
    echo "<br>";
    }
    ?>

正如您所看到的,使用上面的代码我可以打印出前三名的人物。名。 如果我把它添加到循环中:

    mysql_query("UPDATE users SET Balance = Balance + $reward WHERE Name = '$name'");

他们会得到相同的奖励。

所以我认为我需要让他们的名字给他们不同的奖励。

    $reward1 = 1000;
    $reward2 = 500;
    $reward3 = 100;

我怎样才能得到他们的名字?还是有办法做这个工作?

2 个答案:

答案 0 :(得分:2)

我建议你,你可以创建一个奖励数组,而不是变量,分别在while循环中调用它,参见下面的例子:

$rewards = array(
    1000,
    500,
    100
);

$rewardIndex = 0;
while ($row = mysql_fetch_array($result))
{
    mysql_query("UPDATE users SET Balance = Balance + $rewards[$rewardIndex] WHERE Name = '$name'");
    $rewardIndex++;
}

注意:mysql_*函数已弃用,将来会被删除,您可以使用PDOMySQLi

答案 1 :(得分:1)

您可以使用变量枚举它们,然后在case语句中使用它。实际上,您可以在SQL中完成所有工作:

UPDATE users u
    SET balance = (CASE @rn := COALESCE(@rn + 1, 1)
                        WHEN 1 THEN balance + 1000
                        WHEN 2 THEN balance + 500
                        WHEN 3 THEN balance + 100
                        ELSE balance
                 END)
    ORDER BY score DESC
    LIMIT 3;

编辑:

用户定义的变量只保存额外的join

UPDATE users u JOIN
       (SELECT u2.*, (@rn := @rn + 1) as rn
        FROM users u2 CROSS JOIN
             (SELECT @rn := 0) params
        ORDER BY score DESC
        LIMIT 3
       ) u2
       ON u.user_id = u2.user_id
    SET u.balance = (CASE WHEN rn = 1 THEN balance + 1000
                          WHEN rn = 2 THEN balance + 500
                          WHEN rn = 3 THEN balance + 100
                          ELSE balance
                     END);

不幸的是,当您使用update时,MySQL不允许您在ORDER BY语句中初始化变量。