Переменная MySQL неправильно увеличивается - PullRequest
1 голос
/ 01 ноября 2011

Выполнение следующего запроса

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) и тот же неверный результат.

Будем весьма благодарны за любые идеи / предложения относительно того, почему может быть не получен результат

1 Ответ

3 голосов
/ 01 ноября 2011

Полагаю, это связано с планом выполнения, выбранным в каждом случае, и сочетанием с применением номеров строк - в некоторых из этих планов. Вычисляются номера строк, а затем оцениваются условия 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...