以循环方式为每个配置选择前n条记录

时间:2018-11-28 17:41:30

标签: mysql algorithm python-2.7 data-structures

已经有一段时间了,我无法将自己的头围在尝试创建的算法上。 在表中存储了具有不同配置的对象列表。

例如,可以有m种不同类型的配置, A,B,C等

每种配置类型都可以有子类型

Object,Parent Configuration,Configuration,Rank
O1, A, A1, 1
O2, A, A2, 2
O3, A, A3, 3
O4, B, B1, 4
O5, B, B2, 5
O6, B, C1, 6
O7, C, C2, 7

给出一个用户,该用户想要按等级按指定配置顺序排列n个具有任何配置的对象,这样就不会有最大可能的不同对象配置,例如:

如果n == 3,并且配置用户感兴趣的是A1,A2,B1,B2,C1,C2

然后使用普通的sql查询

SELECT *
FROM   table
WHERE  configuration IN ( a1, a2, b1, b2,
                          c1, c2 )
ORDER  BY rank
LIMIT  3;  

然后输出将是对象O1,O2和O3,因为它们的排名最高,但是最佳解决方案是将对象O1,O4,O6返回给每个父配置最高级别的对象,

让我们说,如果在上面的示例中n == 4,则输出为 O1,O4,O6和O2,因为我们用尽了所有不同类型的配置,因此我们再次返回了顶级对象。

有帮助吗?

1 个答案:

答案 0 :(得分:0)

在无法访问RANKROW_NUMBER函数的情况下,您可以尝试以下操作:

SELECT main.Object, main.ParentConfiguration, main.Configuration, main.Rank, COUNT(prev.Object) AS RelativeRank
FROM t AS main
LEFT JOIN t AS prev ON prev.ParentConfiguration = main.ParentConfiguration AND prev.Rank < main.rank AND prev.Configuration IN ('A1', 'A2', 'B1', 'B2', 'C1', 'C2')
WHERE main.Configuration IN ('A1', 'A2', 'B1', 'B2', 'C1', 'C2')
GROUP BY main.Object, main.ParentConfiguration, main.Configuration, main.Rank
HAVING COUNT(prev.Object) < (
    SELECT CEILING(3 / COUNT(DISTINCT ParentConfiguration)) -- this is where you specify 3
    FROM t
    WHERE Configuration IN ('A1', 'A2', 'B1', 'B2', 'C1', 'C2')
)

请注意,如果您在HAVING子查询中指定4,则它将返回CEILING(4/3)=每组2行,即6行。