我遇到了复杂的订购问题。我有以下示例数据:
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的category
的 frequency
是
均匀分布 - 以便一行后跟不同的category_id
只要有可能。例如行category_ids
:1,2,1,3,1,2。
category_ids
categories
frequency
<> 0的行应该是
从ca.插入从它们之间的最小频率行开始
(差距应该有所不同)。在我的示例中,这些是category_id
= 2的行。
因此结果可以从行号#1开始,然后是#4,然后是至少4行其他行
categories
,然后是#5。
在最终结果中,具有相同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类别的条目。