MySQL或PHP:根据分数找到最佳的行组合

MySQL或PHP:根据分数找到最佳的行组合,php,mysql,sql,Php,Mysql,Sql,我有一个MySQL数据库,包含以下列 Flavour1| Flavour2 | Score ------------------------------------- Vanilla | Strawberry | 7 Choc | Toffee | 8 Vanilla | Choc | 6 Toffee | Vanilla | 7 等等 我希望能够从表中选择N行,这些行组合在一起具有最高的总分,但每种味道可以呈现的次数受到限制

我有一个MySQL数据库,包含以下列

Flavour1| Flavour2      | Score
-------------------------------------
Vanilla | Strawberry    | 7
Choc    | Toffee        | 8
Vanilla | Choc          | 6
Toffee  | Vanilla       | 7
等等

我希望能够从表中选择N行,这些行组合在一起具有最高的总分,但每种味道可以呈现的次数受到限制

例如,我可能想选择5个最佳风味组合行,其中没有任何单一风味出现超过Flavour1+Flavour2<3计数的3倍

由于db必须比较所有的组合以获得分数,同时还要计算一种风味的出现次数,因此我很难弄清楚如何做到这一点

非常感谢任何帮助


编辑-如果在PHP中有一种算法方法也可以接受。

按照规定,在SQL中没有有效的方法。您可以通过生成所有组合,然后在where子句中应用所需的规则来实现这一点。我还假设每列上都有一个id,唯一地标识一对

在您的情况下,因为您允许重复,所以我会为每个组合添加一个计数,并将其用于组合:

create view v_withcounts as
    select t.*, 1 as cnt
    from table t
    union all
    select t.*, 2 as cnt
    from table t
    union all
    select t.*, 3 as cnt
    from table t;
然后,对于查询:

select v1.id, coalesce(v1.cnt),
       v2.id, coalesce(v2.cnt),
       v3.id, coalesce(v3.cnt),
       v4.id, coalesce(v4.cnt),
       v5.id, coalesce(v5.cnt)
from v_withcounts v1 left join
     v_withcounts v2
     on v2.id not in (v1.id) left join
     v_withcounts v3
     on v3.id not in (v1.id, v2.id) left join
     v_withcounts v4
     on v4.id not in (v1.id, v2.id, v3.id) left join
     v_withcounts v2
     on v5.id not in (v1.id, v2.id, v3.id, v4.id)
where (coalesce(v1.cnt, 0) + coalesce(v2.cnt, 0) + coalesce(v3.cnt, 0) +
       coalesce(v4.cnt, 0) + coalesce(v5.ccnt, 0)
      ) = 5

在算法上,可能有更有效的方法来解决这个问题。我怀疑贪婪算法会快得多,并且会生成您想要的结果。

这显然是错误的。太妃糖|香草应该得分最高!:-无论如何,考虑提供一个更合适的代表性数据集作为一组DDLs和/或SqLFIDLE连同相应的结果集。味道的顺序是否重要?我的意思是,如果你有太妃糖|香草| 7,这是否也意味着香草|太妃糖| 7?顺序并不重要,但所有可能的组合都将以行的形式出现在表中,分数可能会在将来发生变化。谢谢-我可以看到这将如何工作,但它在我的MySQL服务器上超时,因此我假设我应该用PHP算法来完成。有什么想法吗?@user1491032。首先,在一小部分数据上尝试这个方法,看看逻辑是否有效。在php中也会遇到类似的问题,因为您必须创建一个5路笛卡尔积来解决您描述的问题。