0

我有一个网页,人们可以在其中发布 0 到 10 之间的单个数字。

就像每天一次的乐透单号生成一样。我希望我的 PHP 脚本检查所有用户发布的数字,并将 +1 或 -1 的分数分配给相对的赢家(或输家)。

问题是,一旦我在数据库中查询获胜用户的列表,我想更新他们的“分数”字段(在“用户”表中)。我在想这样的循环(伪代码)

foreach winner{
    update score +1
}

但这意味着如果有 100 个获胜者,那么将有 100 个查询。有没有办法用一个查询进行某种批量插入?

提前致谢。

4

3 回答 3

1

您没有指定数字的存储方式。如果有大量的人发帖,一个不错的选择是使用数据库来存储他们的号码。

例如,您可以lotto使用三个字段调用一个表posted_numberscoreemailposted_number在该字段上创建一个(非唯一!)索引。

create table lotto (posted_number integer(1) unsigned, score integer, email varchar(255), index(posted_number));

要更新他们的分数,您可以执行两个查询:

update lotto set score = score+1 where posted_number = <randomly drawn number here>
update lotto set score = score-1 where posted_number = <randomly drawn number here>
于 2012-06-27T14:44:45.570 回答
1

我假设您正在使用带有 sql 的数据库,并建议您可能想做类似的事情

UPDATE `table` SET `score`=`score`+1 WHERE `number`=3;

以及相应的失败者-1(奇怪,看不到-1的理由)。

但是,如果没有更多详细信息,我将无法提供进一步的帮助。

于 2012-06-27T14:46:15.160 回答
0

假设我们有一个名为postsand的数据表users。显然,users包含赌徒的数据(带有一个方便的id字段和points他们拥有的点数),并posts包含post_id行的 ID 字段,user_id即用户的 ID,value以及发布的数字本身。

现在您只需在脚本中实现以下 SQL 查询:

UPDATE users INNER JOIN posts ON users.id = posts.user_id SET users.points = (users.points + 1) WHERE posts.value = 0;

末尾0的位置将替换为随机抽取的数字。

这个查询会做什么?使用该INNER JOIN构造,它将在两个表之间创建一个链接。自动,如果posts.value匹配我们的号码,它将链接 posts.user_idusers.id,知道哪个用户必须points修改他/她。如果有人赌博0,并且他的 ID( posts.user_id) 是8170,则该points字段将为拥有的用户更新user.id = 8170

如果您更改查询以使其成为(users.points - 1)WHERE posts.value != 0,您将让非获胜者扣除一分。它可以根据需要进行调整。

小心点!每次每日抽奖后,帖子表都需要截断或存档。

另一种选择是存储time()用户投注数字的时间戳(在 PHP 中),并在执行时检查存储的时间戳......是否在当天的开始和结束之间。

提示:您可以使用图形数据库软件(如 Microsoft Access 或 LibreOffice Base)JOIN在图形显示器上模拟您的 s 等。它使初学者更容易建模此类问题。如果您不想要桌面安装的软件,尝试安装phpMyAdmin也是另一种解决方案。


编辑:

非关系数据库

如果您要使用非关系型数据库,您首先需要获取所有获胜者ID

SELECT user_id FROM posts WHERE value=0;

这将为您提供多行的结果。现在,您将需要逐一检查此结果,并执行以下查询:

UPDATE users SET points=(users.points + 1) WHERE id=1;

0是中奖号码,是用户更新1的并发数。)id

不使用 MySQL 的关系功能,但使用 MySQL 数据库,脚本将如下所示:

<?php
$number = 0; // This is the winning number we have drawn

$result = mysql_query("SELECT user_id FROM posts WHERE number=" .$number);

while ( $row = mysql_fetch_assoc($result) )
{
    $curpoints_result = mysql_query("SELECT points FROM users WHERE user_id=" .$row['user_id']);
    $current_points = mysql_fetch_assoc($curpoints_results);

    mysql_query("UPDATE users SET points=" .($current_points['points'] + 1). " WHERE user_id=" .$row['user_id']);
}
?>

while构造使此循环一直运行,直到结果(获胜者列表)的每一行都被更新。

哦,我知道MySQL 是一个关系数据库,但它就是它的本质:一个示例

于 2012-06-27T15:04:16.343 回答