我试图创建一个临时表或视图,用于绘制联盟成员在赛季中改变差点的图表。这需要创建一个数据透视表。
然而,在此之前,我需要创建一个序数列来表示该赛季所参与的第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
我希望有一个带有序数的新专栏,但是新专栏都是零。在我继续尝试数据透视表之前,我必须得到这些序数,所以我希望有人可以告诉我我的错误。
答案 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
答案 1 :(得分:0)
好的,事实证明,毕竟我没有在我的Ordinal专栏中获得全部1,只是在前25个记录中。由于显然是错误的,我没有进一步看。
我提供的样本数据是物理顺序和逻辑顺序,但MY ACTUAL数据不是。这是我能想到的唯一区别,所以我进一步调查,发现在输出的前1000条记录中,我得到了7条记录,其中2条为序数,而不是巧合地,m.ids是连续的。
我创建了一个视图,将数据按顺序放入样本中,将JOINed放入其余表中,但仍然得到Ordinal的错误数据。
当我换出临时表的视图时,它起作用了。事实证明,如果通过加入ORDER的ORDER,将忽略视图中的ORDER BY。
Bill Karwin在另一个问题(46892912)中向我指出了这一点。