我遇到了一个复杂的订购问题。我有以下示例数据:
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_id
和type
均匀分布。
更准确地说,我想以entries
如下方式订购:
category_ids
引用= 0 的 a 分布均匀 - 以便一行尽可能后面跟着一个不同的category
行 。例如行数:1,2,1,3,1,2。frequency
category_id
category_ids
带有<>0
category_ids
的行应该从 ca 插入。以它们之间的最小频率行开头(间隙应该有所不同)。在我的示例中,这些是= 2 的行。所以结果可以从第 1 行开始,然后是第 4 行,然后是最少 4 行的 other ,然后是第 5 行。categories
frequency
category_id
categories
最终结果中相同的行
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 类别条目。