请注意...我从臀部射击。您可能会在下面的代码中发现小错误或逻辑错误。我也不是 MySQL 专家,所以我可能做了一个假设,这对大多数 DBMS 都是正确的,但对 MySQL 来说并不正确。与一粒盐一起服用,并始终彻底测试。
我将以您的问题为例,说明如何考虑您的要求:
如何为指定的比赛日期创建一个返回的查询,
让我们从这里开始。您需要指定比赛日期的所有比赛,这将涉及从Races
表中选择行:
SELECT *
FROM Races
WHERE racedate = '2010-10-01'
比赛时间/路线/马
这只是您要选择的数据,但并非所有数据都在您的Races
表中。你可以得到racetime
and course
from 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
骑师在那条赛道上只有一次骑行
这个有点棘手。此时您需要做的是暂停当前查询并启动新查询以查看特定骑师在特定日期在特定赛道上跑了多少场比赛。我们可以jockey
从Runners
表中获取,但我们需要连接回Races
表以获取racedate
and 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
,从父查询中获取course
和racedate
(我在子查询表上使用别名,以免将这些表与父表混淆,因为它们是相同的):
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 不会混淆)