在我的 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 分钟也可以。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)