SQL ГРУППИРОВАТЬ ПО VS индивидуально выбирая данные

#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)