-2

我在 MySQL 中有两个表:

Races- 包括raceid, racedate, racetime,course

Runners- 包括horseid, raceid, horse, jockey,trainer

我如何创建一个查询,该查询返回,对于指定racedate的,racetime//其中 a只有一次骑行course,而那是唯一的?horsejockeycoursehorsetrainerhorsecourseracedate

除了简单的查询,我对 SQL 的了解为零!

4

1 回答 1

1

请注意...我从臀部射击。您可能会在下面的代码中发现小错误或逻辑错误。我也不是 MySQL 专家,所以我可能做了一个假设,这对大多数 DBMS 都是正确的,但对 MySQL 来说并不正确。与一粒盐一起服用,并始终彻底测试。

我将以您的问题为例,说明如何考虑您的要求:

如何为指定的比赛日期创建一个返回的查询,

让我们从这里开始。您需要指定比赛日期的所有比赛,这将涉及从Races表中选择行:

SELECT *
FROM Races
WHERE racedate = '2010-10-01'

比赛时间/路线/马

这只是您要选择的数据,但并非所有数据都在您的Races表中。你可以得到racetimeand coursefrom Races,但horse必须来自 runners。所以下一步是将你Races的表加入到Runners表中:

SELECT Races.racetime
     , Races.course
     , Runners.horse
FROM Races
   , Runners
WHERE racedate = '2010-10-01'
    AND Runners.raceid = Races.raceid

骑师在那条赛道上只有一次骑行

这个有点棘手。此时您需要做的是暂停当前查询并启动新查询以查看特定骑师在特定日期在特定赛道上跑了多少场比赛。我们可以jockeyRunners表中获取,但我们需要连接回Races表以获取racedateand course

SELECT COUNT(*)
FROM Runners
   , Races
WHERE Races.raceid = Runners.raceid
  AND Runners.jockey = 'jockeyName'
  AND Races.course = 'courseName'
  AND Races.racedate = '2010-10-01'

我们现在有一个查询,它将为我们提供一位骑师参加的比赛次数。我们现在可以将它作为子查询合并到我们的原始查询中jockey,从父查询中获取courseracedate(我在子查询表上使用别名,以免将这些表与父表混淆,因为它们是相同的):

SELECT Races.racetime
     , Races.course
     , Runners.horse
FROM Races
  , Runners
WHERE racedate = '2010-10-01'
  AND Runners.raceid = Races.raceid
  AND (    SELECT COUNT(*)
           FROM Runners AS sub_run
              , Races AS sub_race
           WHERE sub_race.raceid = sub_run.raceid
             AND sub_run.jockey = Runners.jockey
             AND sub_race.course = Races.course
             AND sub_race.racedate = Races.racedate
      ) = 1

那匹马是训练师在那场比赛中唯一的马

这将是另一个子查询,正如您此时可能猜到的:

SELECT COUNT(DISTINCT Runners.horsename)
FROM Runners
   , Races
WHERE Races.raceid = Runners.raceid
  AND Runners.trainer = 'trainerName'
  AND Races.course = 'courseName'
  AND Races.racedate = '2010-10-01'

此查询包括“COUNT(DISTINCT ...)”以确保我们只计算唯一的马名,而不是多次计算同一匹马(多场比赛等)。

SELECT Races.racetime
     , Races.course
     , Runners.horse
FROM Races
  , Runners
WHERE Races.racedate = '2010-10-01'
  AND Runners.raceid = Races.raceid
  AND (    SELECT COUNT(*)
           FROM Runners AS sub_run
              , Races AS sub_race
           WHERE sub_race.raceid = sub_run.raceid
             AND sub_run.jockey = Runners.jockey
             AND sub_race.course = Races.course
             AND sub_race.racedate = Races.racedate
      ) = 1
  AND (    SELECT COUNT(DISTINCT sub_run.horsename)
           FROM Runners AS sub_run
              , Races AS sub_race
           WHERE sub_race.raceid = sub_run.raceid
             AND sub_run.trainer = Runners.trainer
             AND sub_race.course = Races.course
             AND sub_race.racedate = Races.racedate
      ) = 1

(您可以在后续子查询中重复使用子查询表别名——因为每个子查询在不同的上下文中执行,DBMS 不会混淆)

于 2013-10-10T18:11:38.953 回答