代码之家  ›  专栏  ›  技术社区  ›  TigerTiger

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

  •  1
  • TigerTiger  · 技术社区  · 17 年前

    我在产品表中有大约10000种产品。我想检索其中一个项目,并将其显示在网页的某个部分,该部分在特定的一天保持不变。有点像“当日产品”。

    有什么想法/建议吗?

    7 回复  |  直到 17 年前
        1
  •  3
  •   Quassnoi    17 年前
    SELECT  id
    FROM    products
    ORDER BY
            RAND(UNIX_TIMESTAMP(CURRENT_DATE()))
    LIMIT 1
    
        2
  •  2
  •   user254875486 TM Creative    17 年前

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

        3
  •  2
  •   Vamos    17 年前

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

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

    您不需要CRON作业:

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

    这意味着只有当天第一个访问您网站的访问者才会触发更新,并且随后的每个访问者都会收到一个快速加载的缓存文件。

        4
  •  2
  •   LiamB    17 年前

    1. 使用产品ID和日期字段设置一个表来调用ProductOfDay
    2. 在用户访问时的“当日产品”页面上,检查日期字段
    3. 如果不是,则只选择一个新产品并将其保存到现场。

    这不是一个复杂的操作。

        5
  •  1
  •   erikkallen    17 年前
    SELECT  id
    FROM    products
    ORDER BY (id + RAND(UNIX_TIMESTAMP(CURRENT_DATE()))) MOD some_reasonable_value
    LIMIT 1
    
        6
  •  0
  •   Robert    17 年前

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

    使种子值为日期(21)+月份(10)+年份(2009),因此今天的种子值为2041。

        7
  •  0
  •   Community Mohan Dere    9 年前
    total = SELECT COUNT(id) FROM products;
    day_product = SELECT id FROM products WHERE id = (UNIX_TIMESTAMP(CURRENT_DATE()) MOD total) LIMIT 1;
    

    另见 this question .