如何检索随机(但日期唯一)主键值?

时间:2009-10-23 12:49:20

标签: php mysql

产品表中有大约10,000种产品。我想检索其中一个项目并将其显示在网页的一个部分中,该部分在特定日期保持不变。像“今日产品”这样的东西。

例如,如果今天我得到product_id 100,那么今天所有访问者都应该查看此产品项目。明天它可以获取任何随机有效的主键,比如1289,访客明天全天获得1289个产品。

有任何想法/建议吗?

感谢您的帮助。

7 个答案:

答案 0 :(得分:3)

SELECT  id
FROM    products
ORDER BY
        RAND(UNIX_TIMESTAMP(CURRENT_DATE()))
LIMIT 1

答案 1 :(得分:2)

如何在午夜创建缓存文件并使其无效?

这样做的好处是,您不会对数据库进行不必要的调用,因为您只检查缓存文件的时间戳 - 每天只有一次数据库请求填充新的缓存文件。

您不需要CRON作业:

if(date_of_file(potd_cache_file) != today){
  potd_cache_file = generate_from_db();
}
load_file(potd_cache_file);

这意味着只有当天第一位访问您网站的访问者才会触发重新生成,并且每个后续访问者都会向他们提供快速加载缓存文件。

答案 2 :(得分:2)

也许您可以将当天项目的ID存储在数据库的表中?

答案 3 :(得分:2)

这个想法非常简单,

  1. 设置一个名为ProductOfTheDay的表格,其中包含产品ID和日期字段
  2. 在用户访问的日期页面的产品上查看日期字段
  3. 如果是今天的日期,则显示产品
  4. 如果不是,那么就选择新产品并将其保存到现场。
  5. 它不是一个复杂的操作。

答案 4 :(得分:1)

SELECT  id
FROM    products
ORDER BY (id + RAND(UNIX_TIMESTAMP(CURRENT_DATE()))) MOD some_reasonable_value
LIMIT 1

答案 5 :(得分:0)

您可以使用种子值启动随机数生成器。

将种子值设为当天(21日)+月(10)+年(2009),所以今天的种子是2041年。

你将整天获得相同的随机数,明天则是另一个。这更像是在.net中运行的方式。随机函数采用最大值和最小值(这是您的最小和最大ID值),然后是可选的种子值并返回一个数字。对于相同的种子编号,您将获得相同的随机数。如果更改最大值和最小值,则可能会影响生成的数量。你必须查看php是如何工作的。

答案 6 :(得分:0)

total = SELECT COUNT(id) FROM products;
day_product = SELECT id FROM products WHERE id = (UNIX_TIMESTAMP(CURRENT_DATE()) MOD total) LIMIT 1;

另见this question