【问题标题】:How select random column value from Mysql database using PHP如何使用 PHP 从 Mysql 数据库中选择随机列值
【发布时间】:2017-03-05 21:57:45
【问题描述】:

我正在尝试使用 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'];
    }
}

我希望它始终返回随机值,直到数据结束。

【问题讨论】:

  • 将选择放入数组并检查是否in_array并忽略它
  • 你能告诉我怎么做吗?

标签: php mysql random


【解决方案1】:

不要使用你只想要 1 个限制的循环和条件试试这个

$query = mysqli_query(
    $mysql,
    "SELECT postid FROM history ORDER BY Rand() LIMIT 1"
);

$row = mysqli_fetch_assoc($query)

echo $row['postid'];
     

【讨论】:

  • 仍然重复。
【解决方案2】:

这就是 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 为空,它将完成)。您将从cacheTable 中选择rand 结果,然后将其删除,因此它不会出现在下一次选择中。当缓存表中的记录用完时,它会再次填充。

注意:这种方法有一个主要缺点 - 当您在 history 表中有新条目时,它们在缓存表中不可用,直到它为空并再次填充。

【讨论】:

  • 什么是cacheTable结构?
  • 虽然我的历史表有名为postid的列
  • 现在我必须使用主键
  • 所以postId 将成为cacheTable 中的列。
  • 有必要做primary key吗?
【解决方案3】:

这是代码Samir Nabil 建议:

session_start();

$_SESSION['dupes'] = array();

$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)) {
        if (!in_array($row['postid'], $_SESSION['dupes'])) {
            echo $row['postid'];
            $_SESSION['dupes'][] = $row['postid'];
        }
    }
}

【讨论】:

  • 基本上每次刷新页面都会更新数组
  • 也许我要在$_SESSION 中设置值?
  • 如果您希望数组在页面刷新后保持不变,您可以将其存储在会话变量中...代码已更新。
猜你喜欢
  • 2018-01-12
  • 2019-03-25
  • 2015-12-22
  • 2023-03-22
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
相关资源
最近更新 更多