gpt4 book ai didi

php - 混合不同类别的结果,在 MySQL 中按分数排序

转载 作者:可可西里 更新时间:2023-11-01 08:37:43 25 4
gpt4 key购买 nike

在我的 PHP 应用程序中,我有一个 mysql 文章表,其中包含以下列:

article_id    articletext    category_id    score

每篇文章都有一个分数,它是根据它的受欢迎程度计算出来的,并且属于一个特定的类别(大约有 10 个类别可用)

我的问题是:如何执行返回得分最高的文章的查询,同时按类别交替它们,以便尽可能不连续返回相同类别的文章。例如,如果得分最高的文章得分为:100,则返回集将类似于:

article_id    articletext    category_id    score
-----------------------------------------------------
142 <.....> 5 100
153 <.....> 3 97
119 <.....> 5 99
169 <.....> 2 93
121 <.....> 7 89
197 <.....> 2 92
.
.
.

想到的第一个(天真的)解决方案是执行 10 次选择(每个类别 1 次),按分数降序排列,然后,在 PHP 级别,在每个返回的数据集之间交替,一次选择一个结果,然后将它们组合在一个新数组中。

有没有更有效的方法来实现这一点?如果可能,在 MySQL 级别

最佳答案

去获取前20个,如果不满足要求,再追加查询,获取缺失的部分。您应该能够在查询数量和每次返回的行数之间取得一些平衡。

如果您获得了前 100 名,它可能会在 90% 的时间内满足要求,并且比 10 个单独的查询成本更低、速度更快。

如果是 SQL Server,我可以提供更多帮助...

其实我还有一个想法。每 5 分钟运行一次计算列表并将其缓存在表中的进程。使针对相关表的 DML 使缓存无效,因此在重新填充之前不会使用缓存(可能删除了一篇文章)。如果缓存无效,您将回退到动态计算...并且无论如何都可以使用它来重新填充缓存。

有可能策略性地更新缓存列表而不是重新计算它。但这可能是一个真正的挑战。

这应该有助于提高查询速度和减少数据库的负载。如果您的文章列表过时 5 分钟,那应该没什么大不了的。哎呀,即使 1 分钟也可能有效。

关于php - 混合不同类别的结果,在 MySQL 中按分数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6244787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com