我有一个充满运动成绩的数据库。我想根据之前结果的一些特征来选择一些结果。这是数据库结构:
CREATE TABLE `results` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`date` DATETIME NOT NULL ,
`home_score` INT NOT NULL ,
`away_score` INT NOT NULL ,
`home_team_id` INT NOT NULL ,
`away_team_id` INT NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
所以我想做一些查询,比如“查找球队在前两场主场比赛中获胜的结果”——即按日期对特定的 home_team_id 排序,然后选择前两行中的每一行 home_score > away_score。
我知道这有点复杂,因此将非常感谢有关如何解决此问题的任何指示。我目前有一个 PHP 版本(选择所有行,然后执行这种类型的查询),但性能非常慢,并且使用了大量内存(数据库中有超过 20,000 行)。
编辑:感谢几个简洁的答案。不过,理想情况下,我希望能够在所有列上运行查询,而不仅仅是查看 W、D 或 L。一个更复杂的示例是“查找主队在之前的五个主场均获胜的所有结果至少两场比赛,客队在每场客场比赛中都至少输掉一球。”
如果您希望其表现良好,您应该链接表中的连续结果,例如。有一个prev_result_id列,每当插入新结果时,您都将其设置为上一个结果。这样你就可以解决问题如下:
SELECT * FROM
(SELECT * FROM results WHERE home_team_id = ID ORDER BY date DESC LIMIT 1) r1
INNER JOIN results r2 ON r2.id = r1.prev_result_id
WHERE r1.home_score > r1.away_score AND r2.home_score > r2.away_score
Run Code Online (Sandbox Code Playgroud)
编辑。为了进一步改进这一点,您还可以拥有next_result_id字段(已索引),并将最后一个结果设置为 NULL(因为还没有下一个结果)。这样你就可以摆脱 FROM 中的子查询,因为你根本不必按日期排序:
SELECT * FROM results r1 INNER JOIN results r2 ON r2.id = r1.prev_result_id
WHERE r1.home_team_id = ID AND r1.next_result_id IS NULL
AND r1.home_score > r1.away_score AND r2.home_score > r2.away_score
Run Code Online (Sandbox Code Playgroud)
如果您想查找赢得前两场比赛的所有球队,这尤其是一个好方法,因为现在您可以简单地省略r1.home_team_id = IDfrom the where 子句,并且它应该为每支赢得前两场比赛的球队提供一行。