MySQL创建序数

时间:2017-10-22 04:24:36

标签: mysql ordinal

我试图创建一个临时表或视图,用于绘制联盟成员在赛季中改变差点的图表。这需要创建一个数据透视表。

然而,在此之前,我需要创建一个序数列来表示该赛季所参与的第n场比赛。我不能使用date_played,因为玩家可以在所有不同的日期玩,我希望每个玩家的第二场比赛在垂直排列,而他们的第三场比赛也是如此,等等。

我使用了this question的答案中的代码,这似乎应该可行。这是相关部分的副本:

SELECT books.*, 
if( @libId = libraryId, 
    @var_record := @var_record + 1, 
    if(@var_record := 1 and @libId := libraryId, @var_record, @var_record)
) AS Ordinal 
FROM books
JOIN (SELECT @var_record := 0, @libId := 0) tmp
ORDER BY libraryId;

`lwljhb_lwl_matches`        # One record for each match played
id
date_played
other fields about the match

id    date_played
1     2017-08-23
2     2017-08-29
3     2017-09-26
4     2017-08-24
5     2017-09-02
6     2017-09-21
7     2017-08-24
8     2017-08-31
9     2017-09-05
10    2017-09-15
11    2017-09-17
`lwljhb_users`
id
display_name

id    display_name
1     Alan
2     Bill
3     Dave


`lwljhb_lwl_players`  # One record per player per match
id
match_id              # Foreign key to matches.id
player_id             # Foreign key to users.id
end_hcp
other fields about the player's performance in the linked match

id   match_id  player_id  end_hcp
1    1         1          720
2    2         1          692
3    3         1          694
4    4         2          865
5    5         2          868
6    6         2          842
7    7         3          363
8    8         3          339
9    9         3          332
10   10        3          348
11   11        3          374

通常每个MATCH记录在PLAYERS中会有两条记录,但我没有在这里添加它们。 id和match_id在每个PLAYERS记录中相同的事实是人为的,因为这不是真实数据。

在使用此代码段之前,我的代码如下所示:

SELECT u.display_name,
   m.date_played,
   p.end_hcp 
FROM `lwljhb_lwl_matches` AS m
INNER JOIN `lwljhb_lwl_players` AS p
INNER JOIN `lwljhb_users` AS u
ON    m.id = p.match_id AND
      p.player_id = u.id
WHERE league_seasons_id = 12 AND
      playoff_round = 0
ORDER BY u.display_name, m.date_played

并生成如下所示的数据:

display_name  date_played  end_hcp
Alan          2017-08-23   720
Alan          2017-08-29   692
Alan          2017-09-26   694
Bill          2017-08-24   865
Bill          2017-09-02   868
Bill          2017-09-21   842 
Dave          2017-08-24   363
Dave          2017-08-31   339
Dave          2017-09-05   332
Dave          2017-09-15   348
Dave          2017-09-17   374 

在赛季期间的任何时候,每个球员都会有不同数量的比赛,但到赛季结束时,他们将会进行相同数量的比赛。

我试图将Alin Stoian的代码整合到我的中,如我所愿,更改变量名和字段名。

SET @var_record = 1;
SELECT u.display_name,
   m.date_played,
   p.end_hcp, 
    if( @player = u.display_name, 
    @var_record := @var_record + 1, 
        if(@var_record := 1 and @player := u.display_name, @var_record, @var_record)
) AS Ordinal 
FROM `lwljhb_lwl_matches` AS m
INNER JOIN `lwljhb_lwl_players` AS p
INNER JOIN `lwljhb_users` AS u
JOIN (SELECT @var_record := 0, @player := 0) tmp
ON    m.id = p.match_id AND
      p.player_id = u.id
WHERE league_seasons_id = 12 AND
      playoff_round = 0
ORDER BY u.display_name, m.date_played

我希望有一个带有序数的新专栏,但是新专栏都是零。在我继续尝试数据透视表之前,我必须得到这些序数,所以我希望有人可以告诉我我的错误。

2 个答案:

答案 0 :(得分:0)

试试这个:

SELECT u.display_name,
    m.date_played,
    p.end_hcp, 
    @var_record := if ( @player = u.display_name, 
                        @var_record + 1,
                        if(@player := u.display_name, 1, 1)
                    ) AS Ordinal 
FROM `lwljhb_lwl_matches` AS m
INNER JOIN `lwljhb_lwl_players` AS p
INNER JOIN `lwljhb_users` AS u
JOIN (SELECT @var_record := 0, @player := 0) tmp
ON    m.id = p.match_id AND
      p.player_id = u.id
WHERE league_seasons_id = 12 AND
      playoff_round = 0
ORDER BY u.display_name, m.date_played

Demo

答案 1 :(得分:0)

好的,事实证明,毕竟我没有在我的Ordinal专栏中获得全部1,只是在前25个记录中。由于显然是错误的,我没有进一步看。

我提供的样本数据是物理顺序和逻辑顺序,但MY ACTUAL数据不是。这是我能想到的唯一区别,所以我进一步调查,发现在输出的前1000条记录中,我得到了7条记录,其中2条为序数,而不是巧合地,m.ids是连续的。

我创建了一个视图,将数据按顺序放入样本中,将JOINed放入其余表中,但仍然得到Ordinal的错误数据。

当我换出临时表的视图时,它起作用了。事实证明,如果通过加入ORDER的ORDER,将忽略视图中的ORDER BY。

Bill Karwin在另一个问题(46892912)中向我指出了这一点。