【问题标题】:mysql subselect alternativemysql子选择替代
【发布时间】:2009-09-30 06:04:45
【问题描述】:

假设我正在分析高中体育记录如何影响上学率。

所以我有一张表格,其中每一行对应于一场高中篮球比赛。每场比赛都有一个客队 id 和一个主队 id(FK 到另一个“球队表”)以及一个主场比分和一个客场比分和一个日期。我正在编写一个查询,将出勤率与本赛季的篮球比赛相匹配。

我的示例输出将是(#_students_missed_classday_of_gamehome_teamaway_teamhome_team_wins_this_seasonaway_team_wins_this_season

我现在想将每支球队上赛季的表现添加到我的分析中。好吧,我将他们上一个赛季存储在游戏表中,但我应该能够通过子选择来完成。

所以在我的主选择语句中,我添加了子选择:

SELECT COUNT(*) FROM game_table
WHERE game_table.date
BETWEEN 'start of previous season' AND 'end of previous season'
AND (
  (game_table.home_team = team_table.id
    AND game_table.home_score > game_table.away_score)
  OR (game_table.away_team = team_table.id
    AND game_table.away_score > game_table.home_score))

在这种情况下,team-table.id 指的是 home_team 的 id,所以我现在计算了他们上一年的所有胜利。

这种计算方法既不占用时间也不占用资源。 Explain SQL 显示我在 Type 字段中有 ALL 并且我没有使用 Key 并且查询超时。我不确定如何使用子选择完成更有效的查询。必须编写其中的 4 个查询(对于主胜、主场负、客胜、客场负)似乎效率极低。

我相信这可能会更清晰。如果有人有问题,我明天绝对会添加颜色

【问题讨论】:

  • 谢谢,我从来不知道这是正确的礼仪。我回去做了/将来也会这样做

标签: sql mysql optimization


【解决方案1】:

在我看来,这是“试图让我的 rdbms 为我做所有事情”的另一种情况。您必须接受您无法针对某些场景/查询优化数据库,并且无论您添加多少索引,子查询之类的东西都会减慢较大的父查询。

您上面的示例就是一个明显的例子:您从子查询中显示的数据(上赛季球队的表现)是静态数据 - 它是历史数据,不能/不会改变。您应该单独查询此数据,将其保存在应用程序的内存中,并在循环时手动将其添加到主查询的结果中。

【讨论】:

  • 谢谢,这是有道理的。为了这个例子,我必须在 SQL 中生成结果。有什么建议吗?
【解决方案2】:

您在 MySQL 中的最佳选择是拥有一个可以根据需要多次加入的视图。

如果 MySQL 支持 CTE,那么您可以在一条语句中完成所有操作...

with prior_season as (
  select ...
)
  select
     ...
  join prior_season as hone_wins on ...
  join prior_season as home_losses on ...
  ... etc

如果这是您非常想做的事情,那么切换到不同的 RDBMS 可能是一个不错的论据。 Postgres 现在支持它们,几乎所有主要商业供应商的免费版本也都支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2014-10-17
    • 2017-11-13
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多