1

我有两张桌子(球队和比赛),我想使用积分和#rank 位置来计算比赛桌。

表格非常简单:团队和比赛(战斗)。“战斗”中的最后一列表示是否进行了战斗。

DROP TABLE IF EXISTS monsters;
DROP TABLE IF EXISTS battles;

CREATE TABLE monsters (id_monster int auto_increment primary key, monster varchar(50));
CREATE TABLE battles  (id_battle int auto_increment primary key, monster_h int, monster_a int, score_a int, score_h int, played tinyint);

这里有一些假数据 (编辑:我已经更新了删除随机分数并应用固定分数的脚本。)

INSERT INTO monsters (monster) VALUES ("Nembo"), ("Kid"), ("Captain"), ("OOI"), ("Koky"), ("Rudes");

INSERT INTO battles (monster_h, monster_a, score_h, score_a, played) VALUES

    (1,2, 3, 2,1),
(2,1, 2, 2,1),
(3,4, 1, 0,1),
(4,3, 0, 1,1),
(5,6, 0, 0,0),
(6,5, 5, 2,1),
(1,3, 6, 0,1),
(3,1, 2, 7,1),
(2,5, 1, 1,1),
(6,4, 0, 0,0),
(4,6, 0, 0,0);

这是我的问题

如您所见,积分计算正确,表格很好!但是... #rank 我错了!我想我也应该加入它。你能在#rank 上帮助我吗?

SELECT m.monster,
        (SUM(CASE WHEN 
                (b.monster_h = m.id_monster AND b.score_h > b.score_a) OR 
                (b.monster_a = m.id_monster AND b.score_a > b.score_h) THEN 3 ELSE 0 END) +

                SUM(CASE WHEN
                (b.monster_h = m.id_monster  OR b.monster_a = m.id_monster) AND b.score_a = b.score_h THEN 1 ELSE 0 END)

                ) as pt,

               (SUM(CASE WHEN 
                (b.monster_h= m.id_monster OR b.monster_a= m.id_monster) THEN 1 ELSE 0 END) ) as pl,

                (@rank := @rank + 1) AS rank 

FROM   ( monsters as m )
LEFT JOIN battles as b ON m.id_monster IN (b.monster_a,b.monster_h)
,( SELECT @rank := 0 ) AS vars 

where b.played = 1

GROUP BY m.monster

order by pt DESC, rand();

结果: #rank 错误

    Monster, PTs, BATTLES, #RANK (good rank should be)

    Nembo,    10,  4,    1       #1
    Captain,  6,   4,    3       #2
    Rudes,    3,   1,    6       #3
    Kid,      2,   3,    2       #4
    Koky,     1,   2,    5       #5
    OOI,      0,   2,    4       #6

更新

使用此数据获得更多具有相同点数和分数的怪物:

(1,2, 3, 2,1),
(2,1, 2, 2,1),
(3,4, 3, 0,1),
(4,3, 0, 1,1),
(5,6, 0, 0,0),
(6,5, 16, 12,1),
(1,3, 6, 0,1),
(3,1, 2, 7,1),
(2,5, 1,1,1),
(6,4, 0, 0,0),
(4,6, 0, 1,1),
(4,2,1,0,1),
(4,5,5,0,1),
(2,3,2,0,1),
(2,1,1,1,1);

然后像 Stefan 所说的那样使用这个脚本:

SELECT *,  (@rank := @rank + 1) AS rank 
FROM ( SELECT @rank := 0 ) as r ,
(SELECT m.monster,
    (SUM(CASE WHEN 
            (b.monster_h = m.id_monster AND b.score_h > b.score_a) OR 
            (b.monster_a = m.id_monster AND b.score_a > b.score_h) THEN 3 ELSE 0 END) +
    SUM(CASE WHEN
        (b.monster_h = m.id_monster  OR b.monster_a = m.id_monster) AND
        b.score_a = b.score_h THEN 1 ELSE 0 END)) as pt,

    (SUM(CASE WHEN 
        (b.monster_h= m.id_monster OR b.monster_a= m.id_monster) THEN 1 ELSE 0 END)) as pl,

 (SUM(CASE WHEN 
        (b.monster_h= m.id_monster ) THEN b.score_h ELSE 0 END) + 

SUM(CASE WHEN 
        (b.monster_a= m.id_monster ) THEN b.score_a ELSE 0 END))  as scored

, floor(rand()*1000) as coin

FROM monsters as m
LEFT JOIN battles as b ON m.id_monster IN (b.monster_a,b.monster_h)
where b.played = 1
GROUP BY m.monster) as result
order by result.pt DESC, scored DESC , coin DESC

该表按 POINTS 作为第一个标准进行排序,然后进行评分。它有效。但是如果我使用“硬币”作为第三个标准......它不起作用!

4

1 回答 1

2

太好了,您包含所有脚本来重新创建您的情况。

将当前查询的结果放入子查询中,@rank 的技巧不适用于GROUP BY.

使用此脚本,我得到正确的结果:

SELECT *,  (@rank := @rank + 1) AS rank 
FROM ( SELECT @rank := 0 ) as r ,
(SELECT m.monster,
    (SUM(CASE WHEN 
            (b.monster_h = m.id_monster AND b.score_h > b.score_a) OR 
            (b.monster_a = m.id_monster AND b.score_a > b.score_h) THEN 3 ELSE 0 END) +
    SUM(CASE WHEN
        (b.monster_h = m.id_monster  OR b.monster_a = m.id_monster) AND
        b.score_a = b.score_h THEN 1 ELSE 0 END)) as pt,
    (SUM(CASE WHEN 
        (b.monster_h= m.id_monster OR b.monster_a= m.id_monster) THEN 1 ELSE 0 END)) as pl
FROM monsters as m
LEFT JOIN battles as b ON m.id_monster IN (b.monster_a,b.monster_h)
where b.played = 1
GROUP BY m.monster) as result
order by result.pt DESC
于 2013-09-20T10:41:51.263 回答