2013-05-23 4 views
2

У меня есть база данных менеджеров фэнтезийного футбола и 15 игроков на каждой из своих команд. Я могу сделать следующее, чтобы перечислить все команды с «Робин Ван Перси».Получение суммы для каждого отдельного значения в базе данных

SELECT * 
FROM `players` 
WHERE MATCH(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) 
AGAINST ('Robin Van Persie' IN BOOLEAN MODE) 

, и я могу это сделать, чтобы подсчитать, сколько есть «Робин Ван Перси» в нем (возвращается только номер).

SELECT count(*) 
FROM `players` 
WHERE MATCH(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) 
AGAINST ('Robin Van Persie' IN BOOLEAN MODE) 

Но есть ли у меня способ получить список, похожий на этот?

Count | Player Name 
------------------------- 
62 | Robin Van Persie 
12 | Wayne Rooney 
22 | Michu 
31 | Theo Walcott 

Для каждого отдельного значения в базе данных?

+4

Сначала вы должны нормализовать свою базу данных, чтобы у всех игроков была своя строка вместо столбца. –

+0

Я никогда не делал нормализации, но в этой базе данных порядок важен. Например, p1-p11 - это настоящая команда, а p12-p15 - subs. Будет ли нормализация испорчена? Если это помогает, у меня есть отдельная база данных со всеми отдельными именами игроков. – Cully

+1

Затем для каждого игрока добавьте свой индекс. –

ответ

1

Вы действительно хотите иметь три стола.

таблица 1
В таблице «игроки», у вас есть 2 столбца: первичный идентификатор, а список всех игроков.

таблица 2
«менеджеры» таблица также имеет 2 колонки: каждое имя менеджера, и первичный Id.

таблица 3
«managers_players» таблица связывает первичный идентификатор каждого менеджера с первичным идентификатором каждого игрока на ней или его команды. Таким образом, технически эта таблица имеет 3 столбца: первичный идентификатор таблицы, идентификатор менеджеров и идентификатор игроков. Таким образом, эта таблица будет иметь несколько экземпляров как с одинаковым идентификатором менеджера, так и с одинаковым идентификатором игрока.

С этой структурой, вы можете запустить запрос, как это (возможно, придется использовать «binarys» на внутренние соединения):

SELECT m.name, count(mp.player_id) as count 
FROM managers_players mp 
inner join managers m 
on mp.manager_id = m.id 
inner join players p 
on p.id = mp.player_id 
group by m.id 
order by count DESC; 

Эта схема будет также сделать его действительно легко видеть игроков на каждом менеджеры команды:

SELECT p.name 
FROM managers_players mp 
inner join managers m 
on m.id = mp.manager_id 
inner join players p 
on p.id = mp.player id 
where m.name like '%Manager Name%'; 

или сделать select m.name и изменить ИНЕКЕ p.name, чтобы увидеть все менеджеры, которые имеют конкретного игрока.

+0

Звучит немного сложнее, чем я ожидал ... У меня уже есть таблица 1 и таблица 2. Моя третья таблица, как вы видите в верхней части этой записи, содержит 15 столбцов для игроков. – Cully

+0

Я мог бы запустить что-то простое, что делает мой запрос выше, и зацикливать его для каждого имени игрока в моей базе данных, но для этого потребуется намного больше времени. Я взгляну на ваше предложение, чтобы посмотреть, стоит ли мне меня менять, поскольку мне потребуется время, а затем снова получить информацию. Спасибо за предложение! – Cully

+1

Да, это займет больше времени, но потерянное время может по-прежнему быть быстрее, чем реализация моих предложений: http: //www.xkcd.com/1205/Вы можете попробовать экспериментировать с вложенными условиями или выбрать операторы. Если это всего лишь небольшая вещь с вашими друзьями, я бы просто нашел «достаточно хороший» взлом и не нашел времени, чтобы исправить схему, но если это для производственной платформы, я бы определенно предложил абстрагировать ее больше в соответствии со схемой, которую я предложил. – Dave