MySQL逻辑排序

4

我目前有这样的查询:

SELECT 'id', 'clanid', 'name',
       'level', 'exp', 'warwinpercent',
       'warswon', 'warslost', 'warstied',
       'playercount', 'score'
FROM clans
WHERE warswon >= 100
ORDER BY warwinpercent DESC, warswon DESC;

现在这样做可以,但最终它并不像我希望的那样合乎逻辑...

例如。

假设有一行的胜率为99.5738%,赢得了208场战争。 还有一行胜率为100%,赢得了103场战争。

我希望99%的行在100%的行上方。有没有办法让我实现这个目标?

我会使用以下公式:

warinpercent = warswon/(warswon+warstied+warlost)*100
order by warwinpercent
if warwinpercent are in a range of 3% then order by warswon between them.

你已经想出了能够按照你喜欢的顺序排列它们的方程式吗? - Ignacio Vazquez-Abrams
2
http://www.evanmiller.org/how-not-to-sort-by-average-rating.html - Lukasz Szozda
@IgnacioVazquez-Abrams 请查看更新。 - user4942382
1
您的排序不具有传递性。 - Karoly Horvath
@lad2025 你有一个 MySql 示例吗? - user4942382
Karoly是正确的。如果你有1000个分数,它们之间的差距都小于3%,但范围从0%到100%不等,那么最终你只会按赢得比赛的数量进行排序。 - trincot
1个回答

7

我建议使用像平均评分如何不排序中的排序方法。

问题:

您需要某种“得分”来进行排序。

错误解决方案1:得分=(积极评价数)-(消极评价数)

错误解决方案2:得分=平均评分=(积极评价数)/(总评价数)

正确解决方案:得分=伯努利参数的威尔逊置信区间下限

enter image description here

演示:

CREATE TABLE clans(id INT, name VARCHAR(100), warswon INT, warslost INT);

INSERT INTO clans VALUES (1, 'aaa',  208, 6), (2, 'bbb', 103, 0);

SELECT id, name,warswon, warslost,((warswon + 1.9208) / (warswon + warslost) - 
                 1.96 * SQRT((warswon * warslost) / (warswon + warslost) + 0.9604) / 
                          (warswon + warslost)) / (1 + 3.8416 / (warswon + warslost)) 
       AS ci_lower_bound 
FROM clans 
ORDER BY ci_lower_bound DESC;

SqlFiddleDemo

输出:

╔═════╦═══════╦══════════╦═══════════╦════════════════════╗
║ id  ║ name  ║ warswon  ║ warslost  ║   ci_lower_bound   ║
╠═════╬═══════╬══════════╬═══════════╬════════════════════╣
║  2  ║ bbb   ║     103  ║        0  ║ 0.9640439675800224 ║
║  1  ║ aaa   ║     208  ║        6  ║ 0.9401908847803808 ║
╚═════╩═══════╩══════════╩═══════════╩════════════════════╝

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接