如何从同一个表的多个行和列中找到最常用的值(在本例中为整数)?从多个列和行中查找最常用的值
我建立一个梦幻足球比赛,我想每星期从用户的阵容得到了最常用的播放器(列PLAYER1以下图像中Player11的):
如何从同一个表的多个行和列中找到最常用的值(在本例中为整数)?从多个列和行中查找最常用的值
我建立一个梦幻足球比赛,我想每星期从用户的阵容得到了最常用的播放器(列PLAYER1以下图像中Player11的):
-- 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;
这是我到现在为止,虽然是超级慢(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
这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/11455506) – Vainglory07
这是一个解决问题的工作方案 –
你应该考虑在改变你目前的设计。给同一个表中的每个玩家一个列是不好的。你应该有一个玩家表与你的用户表相关联。这样你就不需要用户表上的那十一列。 –
我知道了,那是我最初的做法,但是我必须改变这个设计,因为它比每行有11行更有效率,每行都有lineup_id和player_id列 –
如果你要离开表格就像我会做的是创建一个存储过程。在那里创建一个带有列播放器ID的临时表格,然后在表格中选择每个播放器(1-11)列。那么你可以去你选择临时表并获取你需要的数据。但是像Jorge Campos说的那样,你真的应该改变它的设计。 –