php - MYSQL 选择 'random' 行,但如果再次调用,总是给出相同的随机行

标签 php mysql sql optimization random

我的情况是这样的......我有一个排序的机会表。我们有一项付费服务​​,可以让人们随时查看网站上的机会。然而,我们想要一个未付费的 View ,它将显示随机的 %/# 机会,这将始终是相同的。机会按日期排序;例如它们将过期并从列表中删除,并且应该可以免费搜索一个新的。然而,唯一的问题是他们总是必须展示同样的机会。 (例如,我不能只选择随机行,因为如果它们不断刷新,它会循环遍历它们,同样不能只选择即将过期或最远形式到期的行,因为人们最终仍会看到整个列表。

到目前为止,我唯一的解决方案是在表中添加一个额外的列以标记它是开放显示。然后在显示时对它们进行计数,如果我们缺少行,则随机选择更多行。下面是一个模型...

SELECT count(id) as total FROM opportunities WHERE display_status="open" LIMIT 1000;
...
while(total < requiredNumber) {
    UPDATE opportunities SET display_status="open" WHERE display_status="private" ORDER BY random() LIMIT (required-total);
}

谁能想出更好的方法来解决这个问题,最好是不会让我在表中添加另一列的方法,如果很多人同时加载页面可能会发生冲突。最后还有一个注意事项,它不能是随机设置的数量(例如,选择一个,跳过几个,拿下一个)。

任何想法/评论都会很有帮助, 谢谢。

最佳答案

确保用户只看到同一组随机行的一种方法是向随机​​数生成器提供链接到该用户的种子(例如他们的 user_id)。这意味着每个用户都会获得随机排序的行,但每个用户的随机排序始终相同。

你的代码应该是这样的:

 SELECT ...
 FROM   ...
 WHERE  ...
 ORDER BY random(<user id>)
 LIMIT <however many>

注意:正如 Twelfth 指出的那样,随着新行的创建,它们将获得新的订单值,并可能最终出现在您的随机选择中。

关于php - MYSQL 选择 'random' 行,但如果再次调用,总是给出相同的随机行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25085814/

相关文章:

php - 使用 PHP 将表单字段作为 URL 参数传递

php - 适用于 php 5.5.x 的 Microsoft sqlsrv 扩展

php - 如何做跨库信息同步?

php - 如何使用 PHP 和 MySQL 检测用户在完成预订过程之前是否关闭浏览器或选项卡?

mysql - 错误代码 : 1452. 无法添加或更新子行

php - 如何使用数据库中的日期(包括时间)作为 php 表中隐藏字段的值

mysql - 无法用 phpMyAdmin 替换 ../in mySQL

sql - 如果其列包含列表中的任何值,则从结果中排除

mysql - INSERT SELECT ON DUPLICATE 不更新

sql - 在 SQL 中将数据从一个数据库导出到另一个数据库时忽略重复的主键