多列上的数据透视样式计算

Pivot style calculation on multiple columns

我有一个 MySQL table 和一个用户的团队,每个用户都有一个 player1、player2 和 player3 字段。

我正在尝试计算 3 个播放器列中所有用户选择的播放器总数..

用户1可以选择玩家A、玩家C和玩家G。

user2 可以选择 playerE、playerF 和 playerH。

用户 3 可以选择玩家 B、玩家 A 和玩家 F。

用户4可以选择playerC, playerE & playerA.

我可以运行针对每个玩家列的声明,即

SELECT player1, count(*) as total from users;
SELECT player2, count(*) as total from users;
SELECT player3, count(*) as total from users; 

问题是我需要一个包罗万象的结果集,它会显示所有选定球员的总数,所以我会得到如下所示的内容

player        total
playerA       3
playerB       1
playerC       2
playerE       2
playerF       2
playerG       1
playerH       1

我的table结构如下

CREATE TABLE `leaderboard_api` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `competition_id` char(3) DEFAULT NULL,
  `year` year(4) DEFAULT NULL,
  `position` int(4) DEFAULT NULL,
  `name` varchar(128) DEFAULT NULL,
  `player1_name` varchar(128) DEFAULT NULL,
  `player1_score` tinyint(11) DEFAULT NULL,
  `player2_name` varchar(128) DEFAULT NULL,
  `player2_score` tinyint(11) DEFAULT NULL,
  `player3_name` varchar(128) DEFAULT NULL,
  `player3_score` tinyint(11) DEFAULT NULL,
  `total_score` tinyint(11) DEFAULT NULL,
  `missed_cut` tinyint(1) DEFAULT NULL,
  `withdrawn` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

当我运行以下

select player1_name, count(player1_name) as total from leaderboard_api where year = '2015' and competition_id = '014' group by player1_name order by total desc;

我得到了一份球员名单和他们各自的人数。然后我可以 运行 这分别用于 player2_name 和 player3_name 并得到它们的总数。

我遇到的问题是将每个查询中的每个玩家总数加到另一个查询中以获得总计。我分别有 运行 并按预期获得值。

我从@sagi 尝试了下面的解决方案,但它没有计算所有 3 个查询的总和,只给我 1 个作为总数。

SELECT t.player,count(*) FROM (
   SELECT player1 as player FROM `users` UNION ALL
   SELECT player2 FROM `users` UNION ALL
   SELECT player3 FROM `users` UNION ALL
   ....) t
GROUP BY t.player

这是使用查询

的前 100 名
select id, player1_name, player2_name, player3_name from leaderboard_api limit 100;

输出:

1   Donald, Luke    Toms, David Bradley, Keegan
2   Stricker, Steve Bradley, Keegan Watson, Bubba
3   Choi, KJ    Westwood, Lee   Bradley, Keegan
4   Scott, Adam Stricker, Steve Immelman, Trevor
5   Stricker, Steve Garcia, Sergio  Haas, Bill
6   Fowler, Rickie  Schwartzel, Charl   Bradley, Keegan
7   Watney, Nick    Stricker, Steve Levin, Spencer
8   Stricker, Steve Johnson, Zach   Bradley, Keegan
9   Donald, Luke    Points, DA  Fowler, Rickie
10  Westwood, Lee   Donald, Luke    Barnes, Ricky
11  Schwartzel, Charl   Choi, KJ    Haas, Bill
12  Woodland, Gary  Choi, KJ    Garcia, Sergio
13  Donald, Luke    Stricker, Steve Molder, Bryce
14  Garcia, Sergio  Kuchar, Matt    Furyk, Jim
15  Noh, Seung-Yul  Kuchar, Matt    Watney, Nick
16  Donald, Luke    Mickelson, Phil Barnes, Ricky
17  Scott, Adam Fowler, Rickie  Noren, Alexander
18  Johnson, Zach   Molinari, Francesco Toms, David
19  Choi, KJ    Westwood, Lee   Poulter, Ian
20  Mcilroy, Rory   Points, DA  Westwood, Lee
21  McIlroy, Rory   Donald, Luke    Na, Kevin
22  Choi, KJ    Scott, Adam Dyson, Simon
23  Fowler, Rickie  Johnson, Zach   Bradley, Keegan
24  Mcilroy, Rory   Scott, Adam Senden, John
25  Mickelson, Phil Kuchar, Matt    Barnes, Ricky
26  Jimenez, Miguel Angel   Mickelson, Phil Westwood, Lee
27  Donald, Luke    Mcilroy, Rory   Palmer, Ryan
28  Mickelson, Phil Choi, KJ    Poulter, Ian
29  Mcilroy, Rory   Mickelson, Phil Points, DA
30  Johnson, Zach   Stricker, Steve Molinari, Francesco
31  Toms, David Love, Davis Mickelson, Phil
32  McIlroy, Rory   Westwood, Lee   Wilson, Mark
33  Mcilroy, Rory   Garcia, Sergio  Immelman, Trevor
34  Garcia, Sergio  Love, Davis Westwood, Lee
35  Donald, Luke    Stricker, Steve Sabbatini, Rory
36  Mcilroy, Rory   Karlsson, Robert    Romero, Andres
37  Choi, KJ    Yang, Y.E   Toms, David
38  Mcilroy, Rory   Watney, Nick    Kirk, Chris
39  Mcilroy, Rory   Kuchar, Matt    Noren, Alexander
40  Scott, Adam Yang, Y.E   Romero, Andres
41  Donald, Luke    Fowler, Rickie  Jimenez, Miguel Angel
42  Donald, Luke    Jimenez, Miguel Angel   Fowler, Rickie
43  Donald, Luke    Love, Davis Choi, KJ
44  Mcilroy, Rory   Westwood, Lee   Barnes, Ricky
45  Donald, Luke    Fowler, Rickie  Molinari, Edoardo
46  Garcia, Sergio  Choi, KJ    Yang, Y.E
47  Choi, KJ    Fowler, Rickie  Dyson, Simon
48  Fowler, Rickie  Molinari, Francesco Johnson, Zach
49  Stricker, Steve Choi, KJ    Casey, Paul
50  McIlroy, Rory   Choi, KJ    Molinari, Francesco
51  Fowler, Rickie  Jimenez, Miguel Angel   Mickelson, Phil
52  Mcilroy, Rory   Garcia, Sergio  Kim, Kyung-Tae
53  Mcilroy, Rory   Garcia, Sergio  Kim, Kyung-Tae
54  Mcilroy, Rory   Mickelson, Phil Barnes, Ricky
55  Mcilroy, Rory   Mickelson, Phil Barnes, Ricky
56  Fowler, Rickie  Mcilroy, Rory   Wilson, Mark
57  Fowler, Rickie  Love, Davis Watson, Bubba
58  Fowler, Rickie  Harrington, Padraig Poulter, Ian
59  McIlroy, Rory   Mickelson, Phil Jimenez, Miguel Angel
60  Mcilroy, Rory   Fowler, Rickie  Jimenez, Miguel Angel
61  Day, Jason  Johnson, Zach   Bradley, Keegan
62  Stricker, Steve Overton, Jeff   Mickelson, Phil
63  Day, Jason  Furyk, Jim  Toms, David
64  Donald, Luke    Westwood, Lee   Gay, Brian
65  Stricker, Steve Day, Jason  Kim, Kyung-Tae
66  Mahan, Hunter   Stricker, Steve Van Pelt, Bo
67  Day, Jason  Scott, Adam Barnes, Ricky
68  Day, Jason  Johnson, Zach   Love, Davis
69  Fowler, Rickie  Jacobson, Fredrik   Bradley, Keegan
70  Karlsson, Robert    Watney, Nick    Quiros, Alvaro
71  Schwartzel, Charl   Johnson, Dustin Love, Davis
72  Mcilroy, Rory   Scott, Adam Slocum, Heath
73  Day, Jason  Johnson, Zach   Dyson, Simon
74  Day, Jason  Johnson, Zach   Dyson, Simon
75  Day, Jason  Mcilroy, Rory   Garrigus, Robert
76  Donald, Luke    Mcilroy, Rory   Byrd, Jonathan
77  Baddeley, Aaron Garcia, Sergio  Toms, David
78  Day, Jason  Kuchar, Matt    Sabbatini, Rory
79  Johnson, Dustin Choi, KJ    Fisher, Ross
80  Simpson, Webb   Stricker, Steve Yang, Y.E
81  Day, Jason  Mickelson, Phil Barnes, Ricky
82  Johnson, Zach   Howell, Charles Snedeker, Brandt
83  Donald, Luke    Mcilroy, Rory   Stallings, Scott
84  Kim, Anthony    Mickelson, Phil Rose, Justin
85  Kaymer, Martin  Marino, Steve   Westwood, Lee
86  Mahan, Hunter   Kaymer, Martin  Poulter, Ian
87  Mcilroy, Rory   Johnson, Dustin Jimenez, Miguel Angel
88  Mcilroy, Rory   Johnson, Dustin Jimenez, Miguel Angel
89  Laird, Martin   Scott, Adam Snedeker, Brandt
90  Johnson, Dustin Johnson, Zach   Manassero, Matteo
91  Day, Jason  Watney, Nick    Tringale, Cameron
92  Garcia, Sergio  Day, Jason  Quiros, Alvaro
93  Day, Jason  Moore, Ryan Toms, David
94  Day, Jason  Mcilroy, Rory   Barnes, Ricky
95  Baddeley, Aaron Mcilroy, Rory   Yang, Y.E
96  Westwood, Lee   Jacobson, Fredrik   Kim, Kyung-Tae
97  Day, Jason  Mcilroy, Rory   Molinari, Edoardo
98  Day, Jason  Garcia, Sergio  Cink, Stewart
99  Bjorn, Thomas   Scott, Adam Woods, Tiger
100 Day, Jason  Johnson, Dustin Levin, Spencer

如果我没理解错的话,你可以使用UNION ALL:

SELECT t.player,count(*) FROM (
   SELECT player1 as player FROM `users` UNION ALL
   SELECT player2 FROM `users` UNION ALL
   SELECT player3 FROM `users` UNION ALL
   ....) t
GROUP BY t.player

编辑:我认为你的名字中有空格,所以他们没有分组为一组,试试这个:

SELECT replace(t.player,' ',''),count(*) FROM (
   SELECT player1 as player FROM `users` UNION ALL
   SELECT player2 FROM `users` UNION ALL
   SELECT player3 FROM `users` UNION ALL
   ....) t
GROUP BY replace(t.player,' ','')

你也可以尝试替换这一行:

replace(t.player,' ','')

这一行:

trim(t.player)

取决于您的数据看起来如何。

在开始使用上述@sagi 的解决方案后,我最终解决了这个问题,子table 如果这是正确的语言,则计数丢失。

这是我为可能需要的人提供的解决方案...

select t.player, sum(count) as total from (
select player1_name as player, count(player1_name) as count from leaderboard_api where year = '2015' and competition_id = '033' group by player1_name
UNION
select player2_name, count(player2_name) as count from leaderboard_api where year = '2015' and competition_id = '033' group by player2_name
UNION
select player3_name, count(player3_name) as count from leaderboard_api where year = '2015' and competition_id = '033' group by player3_name)
t group by t.player order by total desc