如何在SQL查询中对多列查询(BY WEIGHT NOT ORDER)进行排序?

时间:2018-01-20 02:50:40

标签: mysql sql sorting

为了使问题简单,我将提供比实际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        |
+---+------------+

0 个答案:

没有答案