为了使问题简单,我将提供比实际SQL查询更简单和抽象的代码。
目前我正在运行两个查询。第一种是获取不同SQL字段的MAX值。例如......如果table.likes
是我们想要影响最终结果顺序的列,我会得到最大值MAX(table.likes) AS max_likes
,然后获得每行的比率到最大值
(table.likes / max_table.max_likes) AS like_ratio
(table.comments / max_table.max_comments) AS comment_ratio
这给了我一个很好的范围[0,1]。然后我可以通过包含一个比例来增加或减少每一行的重要性:{3}为like_ratio
而.2为comment_ratio
。因此like_ratio
变为[.7,1],comment_ratio
变为[.8,1]。
((like_ratio * .3) + .7) * ((comment_ratio * .2) + .8) AS final_weight
这看起来效果不错,但我想知道在最终结果中使用MySQL作为排序字段来衡量多列的更好方法。使用逗号分隔值进行排序显然不能很好地工作,因为table.likes
的相同数量并不经常发生,而忽略了table.comments
之类的其他列。我不是非常希望运行一个查询来查找所有最大值,然后再次运行相同的查询以根据max_table
对值进行排序。
我已经开始使用ATAN(table.likes)
的想法,以便随着table.likes
的增加,体重越来越接近1.这似乎并不理想,因为任何超过某个阈值的东西都会变得越来越相似。
是否有" meta"如果多列对最终排序顺序很重要,应该如何排序?
编辑:示例数据
+---+------------+-------------+-----------------+
| | likes | comments | relevance |
+---+------------+-------------+-----------------+
| 1 | 6 | 1 | 40 |
| 2 | 2 | 12 | 37 |
| 3 | 12 | 24 | 12 |
+---+------------+-------------+-----------------+
首先,我选择MAX(table.likes)
:12,MAX(table.comments)
:24,MAX(table.query_relevance)
:40。
+---+------------+-------------+-----------------+
| | max_likes |max_comments | max_relevance |
+---+------------+-------------+-----------------+
| 1 | 12 | 24 | 40 |
+---+------------+-------------+-----------------+
接下来,我得到每行的比率与其相关的最大值。 likes / max_likes
:6月12日,likes / max_likes
:2月12日,likes / max_likes
:12/12。每列都有类似的内容。
+---+------------+--------------+-----------------+
| |like_weight |comment_weight| relevance_weight|
+---+------------+--------------+-----------------+
| 1 | .5 | .04 | 1 |
+---+------------+--------------+-----------------+
| 2 | .16 | .5 | .92 |
+---+------------+--------------+-----------------+
| 3 | 1 | 1 | .3 |
+---+------------+--------------+-----------------+
接下来,我对每个字段应用某种比例,以便不同的字段具有不同的权重。
+---+-------------+--------------+-----------------+
| |like_weight |comment_weight| relevance_weight|
+---+-------------+--------------+-----------------+
| 1 |.5 * .3 + .7 | .04 * .2 + .8| 1 * .4 + .6 |
+---+-------------+--------------+-----------------+
| 2 |.16 * .3 + .7| .5 * .2 + .8 | .92 * .4 + .6 |
+---+-------------+--------------+-----------------+
| 3 | 1 * .3 + .7 | 1 * .2 + .8 | .3 * .4 + .6 |
+---+-------------+--------------+-----------------+
+---+-------------+--------------+-----------------+
| |like_weight |comment_weight| relevance_weight|
+---+-------------+--------------+-----------------+
| 1 |.85 | .808 | 1 |
+---+-------------+--------------+-----------------+
| 2 |.748 | .9 | .968 |
+---+-------------+--------------+-----------------+
| 3 | 1 | 1 | .72 |
+---+-------------+--------------+-----------------+
最后,我将所有这些值相乘以获得最终排序列...
+---+------------+
| |final_weight|
+---+------------+
| 1 | .6868 |
+---+------------+
| 2 | .6516 |
+---+------------+
| 3 | .72 |
+---+------------+