2011-11-01 81 views
1

运行下面的查询的MySQL变量未递增正确

SET @rownum := 0;  
SELECT customer_id, @rownum := @rownum +1 AS rank, score 
FROM game_table_customers gtc 
INNER JOIN customers c ON c.customers_id = gtc.customer_id 
INNER JOIN game_table gt ON gtc.table_id = gt.table_id 
WHERE c.my_team =11095 
AND gt.event_id =21110 
ORDER BY score DESC 
LIMIT 0 , 30 

正确的结果应该是这样的

CustID Rank Score 
2  1  130000 
39  2  99426 
84  3  99178 
259  4  98963 
339  5  97796 

然而,我所得到的是以下

CustID Rank Score 
2  2  130000 
39  11  99426 
84  20  99178 
259  54  98963 
339  69 97796 

当我排除了event_id子句我得到了正确的结果。但是,当包含event_id时,它会使其偏移。我只尝试了event_id(删除my_team子句)和相同的错误结果。

任何意见/建议,为什么结果可能被关闭,将不胜感激

回答

3

我想这必须做在任何情况下选择的执行计划,并与申请行号的组合 - 在一些那些计划。计算行号,然后对WHERE条件进行评估,因此您会看到非连续的行号。

试试这个(首先得到30个结果,你需要,然后将行号):

SET @rownum := 0; 
SELECT customer_id, @rownum := @rownum +1 AS rank, score 
FROM 
    (SELECT customer_id, score 
    FROM game_table_customers gtc 
     INNER JOIN customers c ON c.customers_id = gtc.customer_id 
     INNER JOIN game_table gt ON gtc.table_id = gt.table_id 
    WHERE c.my_team =11095 
     AND gt.event_id =21110 
    ORDER BY score DESC 
    LIMIT 0 , 30 
) tmp 
ORDER BY score DESC 

我现在不能测试,但你也可以试试这个:

SELECT customer_id, @rownum := @rownum +1 AS rank, score 
FROM game_table_customers gtc 
    INNER JOIN customers c ON c.customers_id = gtc.customer_id 
    INNER JOIN game_table gt ON gtc.table_id = gt.table_id 
    CROSS JOIN (SELECT @rownum := 0 AS rn) dummy 
WHERE c.my_team =11095 
    AND gt.event_id =21110 
ORDER BY score DESC 
LIMIT 0 , 30 
+0

嗯,它的合法工程。尽管由于子查询,性能仍然慢很多。你能解释为什么这个原理起作用吗? –

+0

您确定由于子查询性能较慢吗?一张30行的临时表格不应该放慢速度。 –

+0

我必须删除限制,因为可能会有1000行,可能更多。 –