我想从一组数组元素中生成非重复的随机数。我的数组元素来自数据库。喜欢这个
$b1 = "SELECT id FROM datacards WHERE id<>".$dcard."";
$b2 = mysqli_query($con, $b1) or die (mysqli_query($con));
while($b3 = mysqli_fetch_array($b2))
{
$ids[] = $b3['id'];
}
$Myarray=implode("," , $ids);
我必须从Myarray
生成2个不重复的随机数。
Myarray
包含来自1 to 60
的(ids)整数,除了1个
$b1 = "SELECT id FROM datacards WHERE id<>".$dcard."";
我该怎么做?
答案 0 :(得分:1)
$b1 = 'SELECT `id` FROM `datacards` WHERE `id` <> ' . (int)$dcard . ' ORDER BY RAND() LIMIT 2';
这应排除一个id并选择2个随机ID。
或者使用oop预备语句(假设$ _GET ['dcard']):
if (!empty($_GET['dcard']) && ctype_digit($_GET['dcard'])) {
$db = new mysqli('localhost', 'username', 'password', 'database');
if ($stmt = $db->prepare('SELECT `id` FROM `datacards` WHERE `id` <> ? ORDER BY RAND() LIMIT 2') &&
$stmt->bind_param('i', $_GET['dcard']) &&
$stmt->execute() &&
$stmt->bind_result($id)
) {
while($stmt->fetch()){
$ids[] = $id;
}
$stmt->close();
}
} else {
echo 'Missing/Invalid input data.';
}
或者您可以在查询中使用GROUP_CONCAT()
并检索单个对象。
答案 1 :(得分:1)
未经测试,但希望它能让您使用预准备语句,并使用Royal Bg建议的ORDER BY RAND()
:
$query = 'SELECT id FROM datacards WHERE id <> ? ORDER BY RAND() LIMIT 2';
$stmt = mysqli_prepare($con,$query) or die( mysqli_error($con) );
mysqli_stmt_bind_param($stmt, 's', $dcard);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while($row = mysqli_fetch_array($result))
{
$ids[] = $row['id'];
}
$Myarray = implode("," , $ids);
请注意,由于必须重新排序匹配的所有行,ORDER BY RAND()
对于大数据来说非常慢。最好先计算表中的行数,然后生成一个介于0和行数减1之间的数字。此数字将表示数据库中记录的索引。然后在0和行数减去2之间生成另一个随机数。这将代表数据库中的另一个记录索引。如果第二个索引等于或大于第一个索引,则在其值中加1。使用此算法,您将从数据库中获得两个完全随机的非重复索引。然后你ORDER BY field(id, ?, ?) LIMIT 2
将两个问号标记为要选择的ID,以及要选择它们的顺序。您可以在手册中找到MySQL的FIELD功能:
https://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_field