2016-04-03 49 views
1

我有一個用戶團隊的MySQL表,併爲每個用戶有一個player1,player2 & player3字段。多列數據透視樣式計算

我想從所有用戶跨爲3球員列計算總選定的球員..

user1可以挑選playerA,playerC & playerG。

user2可以選擇playerE,playerF & playerH。

user3可以挑選playerB,playerA & playerF。

user4可以挑選playerC,playerE & playerA。

我可以運行IE

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 

我的表結構如下

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`) 
); 

WHE ñ我運行以下

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 
+1

你能告訴我們你的原始表,或至少從它的樣本? –

+0

你應該有一個連接表,每個使用者和每個玩家一行。 。 。可能被稱爲'UserPlayers'。 –

+0

添加了上面的創建表代碼(如果有幫助的話) – Alan

回答

0

從@sagi上面解決方案開始,我最終解決了這個問題,如果這是正確的語言,那麼子表中的計數就會丟失。

這是我爲那些可能需要它的解決方案...

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 
3

如果我理解正確的話,你可以使用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 

編輯:我認爲你的n有空位埃姆斯所以他們不分組爲一組,試試這個:

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) 

取決於如何恰好你的數據看起來像。

+0

這就是我正在尋找的,但問題是count是全部1,我正在尋找t.player在所有3列中的總共出現次數。所以如果「player A」出現在player1中3次,player2出現5次而player3出現4次,那麼上面的結果集應該將「player A」的次數定義爲12,如果有意義的話? – Alan

+0

我給你的查詢有什麼問題?這就是它所做的。 @alan – sagi

+0

它只是使用count(*)將所有行總計爲1,我正在尋找t.player每次出現的實際次數,因此如果playerA在player1中出現3次,在player2中出現4次,在player5中出現5次player3,那麼我應該得到t.player = playerA和total = 12。這是否讓它變得清晰? – Alan