2012-06-14 67 views
1

我有一张表格,里面有引号排(ID, QUOTE),我有一个查询来获得随机报价(ORDER BY RAND() LIMIT 0,1)。我知道它很慢,但我没有太多的行。所以现在我想得到一天的报价。它应该是一个随机引用,但在一天中不可更改。我不想添加新的列,我不想选择当天的报价。我只是想要一个会得到一个随机引用的查询,但以某种方式来说,整天的报价将是相同的,第二天它将返回其他随机引用。如何做到这一点SQL Palladins?如何获得当天的随机行?

+0

我建议你有一个计划的任务,将得到一个随机报价并将其保存到一些文本文件。这项任务每天执行一次。并阅读此文件的内容,而不是每次要加载当天的报价时对数据库进行查询。 – yasar

回答

9

使用种子基于当前日期的随机数生成器:

ORDER BY RAND(20120714) LIMIT 1 

我也好奇你说的“其他”在这里的意思:

和第二天它将返回其他随机报价。

如果你想每天选择不同的随机报价,那么你不应该使用一个简单的ORDER BY RAND(seed)。这可能会连续三天返回相同的报价。

如果您想避免发生这种情况,您可以改为存储每天选择哪种报价,并从过去n天内未使用的报价中选择随机报价。当然,如果您在上次使用报价时进行存储,那么您的原始问题也有自然的解决方案:

  • 查找上次使用的报价。
  • 如果有,那就是当天的报价。
  • 如果不是,则从过去n天未使用的行中选择一天中的新报价,并更新该行以显示它是今天当天的报价。

我不想添加新列

OK,怎么样一个稍微不同的方法:

ORDER BY RAND(201207) LIMIT 14, 1 
--   yyyymm  dd 

现在你不需要额外的列,你不会得到重复,除了可能当月改变。此解决方案假定您至少有32个引号可供选择。

+0

我喜欢1千行,所以它不是一个很大的风险,我有2倍相同的报价。即使它会发生 - 它不是一个biggie。 –

+0

rand(yyymm)的最后一个订单如何工作?我无法弄清楚...... –

+0

@tomaszs:排序顺序将在一个月的每一天都是相同的,每一天它会从列表中选择下一个(限制偏移量更改)。当它到达下个月时,清单将被重新洗牌。 –

0

解决此问题可能涉及编写一个应用程序,该应用程序每天一次选择您的ID最大值和最小值;从该范围计算一个随机数;然后将该编号写入文件。

负责打印报价的应用程序将根据 存储在文件中的ID选择报价。

现在有足够的语言,如Python,Perl,PHP和其他语言有很好的数据库接口。 Python也有一个随机库。