#sql
#sql
Вопрос:
У меня есть спортивная база данных с таблицей игроков, а затем таблицей голов и пенальти. У каждого гола есть бомбардир (идентификатор игрока), отметка времени, период, матч и т.д. То же самое касается штрафов (и другой статистики).
Теперь я хочу показать свои данные в datagrid. Это таблица игроков, которую можно отфильтровать и отсортировать. Там будут перечислены игроки с их статистикой (количество голов, сумма штрафных минут и т.д.).
В настоящее время я делаю это так, я выбираю всех игроков из базы данных, затем в C# перебираю их и для каждого выполняю запросы для подсчета их целей (ПОДСЧЕТ целей, ГДЕ player_id = p.id), штрафы и т.д.
Интересно, будет ли ГРУППИРОВКА ПО утверждению быстрее? Как это реализуется? Поэтому я буду группировать игроков и для каждого выбирать количество голов и так далее. Или есть еще лучший способ?
Комментарии:
1. Не могли бы вы предоставить подтверждающие данные/примеры?
2. Итак, если у вас 100 игроков, вы собираетесь загрузить базу данных примерно 5-600 запросами? Чтобы получить данные, которые вы можете получить с помощью одного запроса?
3. Так как же мне это сделать? Присоединиться ко всем столам? Не будет ли тогда слишком много ссор? Если у меня будет 10 000 игроков и 1 000 000 статистики?
4. Почему должно быть слишком много строк? Если у вас 10 000 игроков, вам придется подумать о том, как вы представляете данные, независимо от того, как вы получаете данные из БД
5. Я думаю, что я буду СЧИТАТЬ* ГРУППИРОВАТЬ ПО идентификатору игрока по каждой статистике, и эти таблицы присоединятся к таблице игроков
Ответ №1:
Чтобы избежать неправильного подсчета показателей, лучше всего присоединиться к подзапросам, каждый из которых объединяет разные таблицы.
Например:
SELECT player.id as "PlayerId" , player.name AS "Player" , COALESCE(goal.period, penalty.period) AS "Period" , goal.TimeScored , penalty.PenaltyMinutes FROM ( SELECT player_id, period , SUM(time_scored) AS TimeScored FROM goals GROUP BY player_id, period ) goal FULL JOIN ( SELECT player_id, period , SUM(penalty_minutes) AS PenaltyMinutes FROM penalties GROUP BY player_id, period ) penalty ON penalty.player_id = goal.player_id AND penalty.period = goal.period LEFT JOIN players AS player ON player.id IN (goal.player_id, penalty.player_id)