2013-10-06 51 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

满足这个小可爱怪物:

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。我用你的代码更新了帖子。 –