首页 > 解决方案 > MSSQL 对 DB 产品进行排序 每日

问题描述

我有一个 MSSQL 数据库,其中包含大量产品,我想似乎每天都随机排列它们的订单!

因此,当我查询我的数据库时,产品将以随机顺序查找,但在一周中的每一天都是持久的

例如:我有 10.000 个特定类别的产品。每个用户都应该看到此类别中具有相同订单的相同产品。对于访问此类别的每个用户,前 20 名产品应该在一天中保持不变。所以问题是用户不会滚动到足以看到该类别中的最后一个产品。因此,我想每天“洗牌”产品,以便将更多特定类别的产品展示给我的回访者。

所以在我的数据库中,我生成了一个像这样的字段:

(ABS(REVERSE(CAST(CAST(Product_id AS VARBINARY) AS INT))) * CAST(DATEPART ( "weekday" , getdate()) as INT)) as [dailysort]

因此,通过反转和相乘,我似乎最有可能获得一周中每一天的唯一随机列表。

我的问题是:

  1. 这有多安全
  2. 这在哪里会失败
  3. 任何更好的方法

任何建议将不胜感激

标签: sqlsql-serverdatabasecasting

解决方案


我假设您Created_date的产品有一个专栏。

我会将它与模或除法运算符一起使用,DAY(GETDATE())并“构建”我的一日缓存算法。

所以,我ORDER BY看起来像这样:

SELECT
    DAY(CREATED_DATE) / DAY(GETDATE()) [Sorting]
...
ORDER BY Sorting

这样,排序每天都会发生变化,并且在每天查询时给出相同的结果。

更新1:

如果您对重叠结果有相同的结果(在同一天但不同月份添加的产品),您还可以扩展它以增加更多可变性:

SELECT
    DAY(CREATED_DATE) % DAY(GETDATE())       [DSorting]
    , MONTH(CREATED_DATE) % MONTH(GETDATE()) [MSorting]
...
ORDER BY DSorting
    , MSorting

更新 2:

但是,对于我之前的答案,您仍然没有 100% 确定性的方法,所以我建议ORDER BY通过包含您的 PK 列(假设您有一个)来添加一些独特性,如下所示:

SELECT
    DAY(CREATED_DATE) % DAY(GETDATE())       [DSorting]
    , MONTH(CREATED_DATE) % MONTH(GETDATE()) [MSorting]
...
ORDER BY DSorting
    , MSorting
    , ProductID    -- most common PK column name I have ever seen

更新 3:

在您发表评论后,我相信将其替换为就足够了CREATED_DATEProduct_ID这样您就会得到类似的结果:

SELECT
    Product_ID % DAY(GETDATE())      [DSorting]
    , Product_ID % MONTH(GETDATE())  [MSorting]
...
ORDER BY DSorting
    , MSorting
    , Product_ID

推荐阅读