2016-02-29 54 views
0

如何从同一个表的多个行和列中找到最常用的值(在本例中为整数)?从多个列和行中查找最常用的值

我建立一个梦幻足球比赛,我想每星期从用户的阵容得到了最常用的播放器(列PLAYER1以下图像中Player11的):

enter image description here

+3

你应该考虑在改变你目前的设计。给同一个表中的每个玩家一个列是不好的。你应该有一个玩家表与你的用户表相关联。这样你就不需要用户表上的那十一列。 –

+0

我知道了,那是我最初的做法,但是我必须改变这个设计,因为它比每行有11行更有效率,每行都有lineup_id和player_id列 –

+0

如果你要离开表格就像我会做的是创建一个存储过程。在那里创建一个带有列播放器ID的临时表格,然后在表格中选择每个播放器(1-11)列。那么你可以去你选择临时表并获取你需要的数据。但是像Jorge Campos说的那样,你真的应该改变它的设计。 –

回答

0
-- create a temporary table 
CREATE TEMPORARY TABLE game_player (
    player_id INT NOT NULL, 
    game_date DATE NOT NULL, 
    PRIMARY KEY (player_id, game_date) 
); 

-- populate the table for player1-11 
INSERT INTO game_player 
SELECT player1, STR_TO_DATE(`day`, '%Y%m%d') FROM YOURTABLE; 
INSERT INTO game_player 
SELECT player2, STR_TO_DATE(`day`, '%Y%m%d') FROM YOURTABLE; 
... 
INSERT INTO game_player 
SELECT player11, STR_TO_DATE(`day`, '%Y%m%d') FROM YOURTABLE; 

-- view player_id and the date he played - the data you populated 
SELECT * FROM game_player; 

-- GROUP_CONCAT(game_date) to see what days they played (NOT REQUIRED) 
-- most-used player with #games 
SELECT player_id, COUNT(*) games, GROUP_CONCAT(game_date) game_dates 
FROM test.game_player 
GROUP BY player_id 
ORDER BY games DESC 
LIMIT 1; 
-1

这是我到现在为止,虽然是超级慢(200s约1M记录):

SELECT player, COUNT(*) AS `count` FROM (
SELECT player1 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
UNION ALL 
SELECT player2 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
UNION ALL 
SELECT player3 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
UNION ALL 
SELECT player4 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
UNION ALL 
SELECT player5 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
UNION ALL 
SELECT player6 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
UNION ALL 
SELECT player7 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
UNION ALL 
SELECT player8 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
UNION ALL 
SELECT player9 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
UNION ALL 
SELECT player10 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
UNION ALL 
SELECT player11 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
UNION ALL 
SELECT player12 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
UNION ALL 
SELECT player13 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
UNION ALL 
SELECT player14 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
UNION ALL 
SELECT player15 AS `player` FROM `lineup` WHERE `lineup`.`day` = 2015026 
) AS matchDayPlayers GROUP BY player ORDER BY COUNT(*) DESC 
+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/11455506) – Vainglory07

+0

这是一个解决问题的工作方案 –

相关问题