我正在尝试使用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表中有新条目时,它们将在缓存表中不可用,直到它为空并再次填充。

09-25 21:18