2016-02-29 2 views
0

Как найти наиболее используемые значения (в данном случае целые числа) из нескольких столбцов и строк одной таблицы?Найти наиболее используемые значения из нескольких столбцов и строк

Я строй фантазии футбольного матча, и я хочу, чтобы получить наиболее часто используемые игрок каждую неделю от пользователей составов (столбцы player1 к player11 в следующем изображении):

enter image description here

+3

Вы должны учитывать при изменении вашего текущего дизайна. Наличие столбца для каждого игрока в одной таблице не очень хорошо. У вас должна быть таблица игроков, связанная с вашей пользовательской таблицей. Таким образом, вам не нужны эти одиннадцать столбцов в таблице пользователей. –

+0

Я знаю, и это был мой первоначальный подход, но мне пришлось изменить его с помощью этого дизайна, потому что он более эффективен, чем 11 строк для каждой линейки, каждый из которых имеет столбцы lineup_id и player_id –

+0

хорошо, если вы собираетесь покинуть стол так что я бы сделал, это создать хранимую процедуру. там создайте временную таблицу с идентификатором игрока столбца и выберите каждую из столбцов игрока (1-11) в таблицу. то вы можете выбрать, выбрать ли вы в таблице темп и получить нужные данные. но, как сказал Хорхе Кампос, вы действительно должны изменить дизайн того, как это работает. –

ответ

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

Это рабочее решение вопроса –