MySql 逻辑排序依据
MySql Logical Order By
我目前有这样的查询:
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% war 的获胜百分比和 208 war 次获胜。
另一个有 100% war 的胜率和 103 war 的获胜率。
我希望 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.
我建议使用 How Not To Sort By Average Rating
中的顺序
PROBLEM:
You need some sort of "score" to sort by.
WRONG SOLUTION #1: Score = (Positive ratings) - (Negative ratings)
WRONG SOLUTION #2: Score = Average rating = (Positive ratings) /
(Total ratings)
CORRECT SOLUTION: Score = Lower bound of Wilson score confidence
interval for a Bernoulli parameter
演示:
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;
输出:
╔═════╦═══════╦══════════╦═══════════╦════════════════════╗
║ id ║ name ║ warswon ║ warslost ║ ci_lower_bound ║
╠═════╬═══════╬══════════╬═══════════╬════════════════════╣
║ 2 ║ bbb ║ 103 ║ 0 ║ 0.9640439675800224 ║
║ 1 ║ aaa ║ 208 ║ 6 ║ 0.9401908847803808 ║
╚═════╩═══════╩══════════╩═══════════╩════════════════════╝
我目前有这样的查询:
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% war 的获胜百分比和 208 war 次获胜。 另一个有 100% war 的胜率和 103 war 的获胜率。
我希望 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.
我建议使用 How Not To Sort By Average Rating
PROBLEM:
You need some sort of "score" to sort by.
WRONG SOLUTION #1: Score = (Positive ratings) - (Negative ratings)
WRONG SOLUTION #2: Score = Average rating = (Positive ratings) / (Total ratings)
CORRECT SOLUTION: Score = Lower bound of Wilson score confidence interval for a Bernoulli parameter
演示:
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;
输出:
╔═════╦═══════╦══════════╦═══════════╦════════════════════╗
║ id ║ name ║ warswon ║ warslost ║ ci_lower_bound ║
╠═════╬═══════╬══════════╬═══════════╬════════════════════╣
║ 2 ║ bbb ║ 103 ║ 0 ║ 0.9640439675800224 ║
║ 1 ║ aaa ║ 208 ║ 6 ║ 0.9401908847803808 ║
╚═════╩═══════╩══════════╩═══════════╩════════════════════╝