我正在尝试使用Rand()函数从数据库中获取随机列。
它返回随机值,但很多时候返回重复值。
这是我的数据库表的样子。
|------
|Column|Type|Null|Default
|------
|no|int(30)|No|
|postid|varchar(100)|Yes|NULL
|byuser|varchar(32)|Yes|NULL
|likeslimit|int(30)|No|
|createdon|date|No|
|-----
这就是我的PHP代码。
$query = mysqli_query($mysql, "SELECT postid FROM history ORDER BY Rand() Limit 1");
if (mysqli_num_rows($query) == 1) {
while ($row = mysqli_fetch_assoc($query)) {
echo $row['postid'];
}
}
我希望它始终返回随机数,直到数据结束为止。
最佳答案
这是mysql中RAND
的工作方式,并会不时重复结果。但是您可以通过将mysql与php结合使用来实现这种功能。
$query = mysqli_query($mysql, "SELECT postid FROM cacheTable WHERE 1 ORDER BY RAND() LIMIT 1");
$row = mysqli_fetch_assoc($query);
$foundId = (int)$row['postid'];
if((int) $foundId === 0) { // NO records left in cacheTable then fill it up again
mysqli_query($mysql, "INSERT INTO cacheTable (postid) SELECT postid FROM history");
$query = mysqli_query($mysql, "SELECT postid FROM cacheTable WHERE 1 ORDER BY RAND() LIMIT 1");
$row = mysqli_fetch_assoc($query);
$foundId = (int) $row['postid'];
}
mysqli_query($mysql, "DELETE FROM cacheTable WHERE postid=".$foundId); // DELETE the record
$query = mysqli_query($mysql, "SELECT * FROM history WHERE postid=".$foundId);
$result = mysqli_fetch_assoc($query);
cacheTable
将只有一列-ID(主键),它将保存历史记录中的相应ID(主键)。 cacheTable
结构:|------
|Column|Type|Null|Default
|------
|postid|varchar(100)|Yes|NULL
|-----
cacheTable
将用history
表中的所有ID填充(一旦cacheTable
为空,它将完成此操作)。您将从rand
中选择cacheTable
结果,然后将其删除,因此它不会出现在下一个选择中。当我们的缓存表中的记录不足时,它将再次填充。注意:这种方法有一个主要缺点-当您在
history
表中有新条目时,它们将在缓存表中不可用,直到它为空并再次填充。