2

我遇到了一个复杂的订购问题。我有以下示例数据:

table "categories"
id | frequency
 1 |     0
 2 |     4
 3 |     0

table "entries"
id | category_id | type
 1 |       1     |   a
 2 |       1     |   a
 3 |       1     |   a
 4 |       2     |   b
 5 |       2     |   c
 6 |       3     |   d

我想按entries顺序排列行,以便category_idtype均匀分布。

更准确地说,我想以entries如下方式订购:

  1. category_ids引用= 0 的 a 分布均匀 - 以便一行尽可能后面跟着一个不同的category行 。例如行数:1,2,1,3,1,2。frequencycategory_idcategory_ids

  2. 带有<>0category_ids的行应该从 ca 插入。以它们之间的最小频率行开头(间隙应该有所不同)。在我的示例中,这些是= 2 的行。所以结果可以从第 1 行开始,然后是第 4 行,然后是最少 4 行的 other ,然后是第 5 行。categoriesfrequencycategory_idcategories

  3. 最终结果中相同的行type不应彼此相邻。

示例结果:

id | category_id | type
 1 |       1     |   a
 4 |       2     |   b
 2 |       1     |   a
 6 |       3     |   d
 .. some other row ..
 .. some other row ..
 .. some other row ..
 5 |       2     |   c

entries就像用户获得的一连串东西(一次一个)。整个排序应该给用户一些变化。只是为了不总是向他们展示类似的条目,所以它不必是完美的。查询也不必在每次调用时都给出相同的结果——使用 random()完全没问题。

frequencies是否entries为某些类别赋予更高的优先级,以便它们不会分布在整个范围内,而是更多地放在结果列表的开头。即使有很多这样的条目,它们也不应该frequency在开头完全排挤 =0 条目。

我不知道如何开始。我想我可以使用窗口函数并 ntile()通过category_id和分配行type。但我不知道之后如何插入非 0 类别条目。

4

0 回答 0