【问题标题】:SQL GROUP BY VS individually selecting dataSQL GROUP BY VS 单独选择数据
【发布时间】:2022-01-03 23:53:03
【问题描述】:

我有一个体育数据库,其中包含球员表,然后是进球和点球表。每个进球都有一个得分手 (player_id)、time_scored、时期、比赛等。点球(和其他统计数据)也是如此。

现在我想在数据网格中显示我的数据。这是一个可以过滤和排序的玩家表。将列出球员的统计数据(进球数、罚球时间总和等)。

我目前正在这样做,我选择了所有玩家 数据库,然后在 C# 中对它们进行迭代,并为每个运行查询来计算他们的目标(COUNT 个目标 WHERE player_id = p.id)、处罚等。

我想知道,GROUP BY 语句会更快吗?它是如何实施的?因此,我将对球员进行分组,并为每个选择的目标计数等等。还是有更好的办法?

【问题讨论】:

  • 能否提供支持数据/示例?
  • 因此,如果您有 100 名玩家,您将在数据库中增加 5-600 个查询的负担?要获取可以通过单个查询获得的数据?
  • 那我该怎么做呢?加入所有表格?那么行数不会太多吗?如果我有 10 000 名玩家和 1 000 000 个统计数据?
  • 为什么会有太多行?如果您有 10 000 名玩家,您将不得不考虑如何呈现数据,无论您如何从数据库中获取数据
  • 我想我会在每个统计数据上做 COUNT* GROUP BY player_id 并且这些表加入到玩家表中

标签: sql


【解决方案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) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2021-10-27
    • 2015-05-23
    • 2021-03-25
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多