2013-10-06 3 views
0

PlayerLeagueMySQL выбрать номер строки

  • league_id

  • player_id

  • player_position

PlayerStat

  • player_id

  • счет

У меня есть две таблицы, и я хочу, чтобы обновить PlayerLeague, установите player_position число, равное строке:

SELECT * FROM PlayerStat s JOIN PlayerLeague l 
ON s.player_id=l.player_id WHERE l.league_id=3 ORDER BY score DESC; 

Я пытался используйте @i в моем выборе, но с присоединением ORDER BY был проигнорирован.

UPDATE

Итак, теперь у меня есть это, и это работает, но я не уверен, что это нормальный путь. Он будет запускаться каждый час для трех лиг 40-500 игроков.

SET @i=0; 
UPDATE PlayerLeague ll set ll.player_position = (SELECT position FROM (SELECT 
s.player_id, @i:[email protected]+1 as position 
FROM PlayerStat s 
where s.player_id in 
    (SELECT player_id from PlayerLeague l WHERE l.league_id = 3) 
    ORDER BY score DESC) AS t WHERE t.player_id=ll.player_id); 
+0

«но с присоединением ORDER BY был проигнорирован». --- это не игнорируется. 'ORDER BY' сортируется по любому выражению или столбцу, который вы передаете ему – zerkms

+0

Сколько строк с l.league_id = 3 у вас есть? – Mihai

+0

Mihai, у меня есть 3 лиги, от 40 до ~ 500 игроков –

ответ

0

Meet этот маленький милый монстр:

UPDATE PlayerLeague AS l 
    JOIN (
     SELECT p.player_id, @i := @i + 1 AS player_position 
     FROM (
      SELECT ss.player_id 
      FROM PlayerStat AS ss 
       JOIN PlayerLeague AS ll 
        ON ss.player_id=ll.player_id 
      WHERE ll.league_id=3 
      ORDER BY ss.score DESC 
     ) AS p, (SELECT @i := 0) AS tmp 
    ) AS s ON s.player_id=l.player_id 
SET l.player_position = s.player_position 

Итак, что здесь происходит?

  • Самый внутренний запрос выбирает всех игроков в лиге в порядке их результатов.
  • Он завернут в запрос, который добавляет количество строк.
  • Наконец, внешний UPDATE делает то, что вам нужно: добавляет количество строк в таблицу PlayerLeague.
0

попробовать

SELECT * 
    FROM PlayerStat s 
where s.player_id in 
     (select player_id from PlayerLeague l WHERE l.league_id = 3) 
ORDER BY score DESC; 
+0

ty. Я обновил сообщение с вашим кодом. –

Смежные вопросы