我有一个mysql数据中的名字列表,我想随机排序以进行体育赛事抽奖。使用以下代码。
<?php
$user="";
$password="";
$database="";
mysql_connect('localhost',$user,$password);
@mysql_select_db($database) or die( "Unable to select database");
$result = mysql_query("SELECT * FROM entries ORDER BY RAND()")
or die(mysql_error());
$rows = mysql_num_rows($result);
?>
这对我来说通常很有效但是有时候参赛者会两次进入比赛,甚至在随机排序之后他的名字会一个接一个地出现。我应该使用不同的PHP功能吗?或者是添加if子句的问题?
提前致谢...
答案 0 :(得分:1)
在SQL查询中直接实现该条件不是一个好方法,因为它会变得非常复杂,我建议只使用相同的SQL查询获取结果,当返回行时,$ row,使用php的array_unique函数,这将删除所有重复的值,像这样使用它,
<?php
$row_with_no_duplicates = array_unique($rows)
?>
希望这会有所帮助
此函数的工作原理示例:
<?php
$input = array("a" => "green", "red", "b" => "green", "blue", "red");
$result = array_unique($input);
print_r($result);
?>
输出:
Array
(
[a] => green
[0] => red
[1] => blue
)
如果你想保留副本,那么
$input = array("a" => "green", "red", "b" => "green", "blue", "red");
$unique = array_unique($input ); // creating a unique array
$duplicates = array_unique( array_intersect( $input, array_unique(array_diff_key($input, array_unique($input))))); // getting duplicates
array_push($unique, $duplicates); // inserting duplicates at the end
print_r($unique);
输出:
Array ( [a] => green [0] => red [1] => blue [3] => Array ( [a] => green [0] => red ) )
答案 1 :(得分:1)
要考虑的一件事是对随机选择的限制。如果您需要排除已经赢得的人,那么您需要一种方法来记录谁赢了并以某种方式将其添加到WHERE
条款中。请考虑以下架构:
CREATE TABLE tickets (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
winner INT(1) DEFAULT 0
)
然后,您可以生成许多票证并填充数据库。 user_id
代表潜在获胜者的数字ID。这意味着您可以轻松排除以前的获胜者:
SELECT id FROM tickets WHERE winner=0 AND user_id NOT IN (
SELECT user_id FROM tickets WHERE winner=1
) ORDER BY RAND()
现在请记住RAND()
是一个非常非常糟糕的随机数生成器,你永远不会将它用于实际奖品或金钱就行的东西。它只是用于简单。对于实际比赛,您将使用加密安全的随机数生成器。