我有一个充满体育成绩的数据库。我想根据之前结果的某些特征选择一些结果。这是数据库结构:
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
);
所以我想做一些查询,比如“找到一个团队已赢得他们之前的两场主场比赛的结果” - 即按日期对特定的home_team_id顺序进行查询,然后选择前两行中每一行home_score> away_score。
我知道这有点复杂,所以任何关于如何解决这个问题的指针都将受到大力赞赏。我目前有一个PHP版本(选择所有行,然后执行此类查询)但性能非常慢,并且它使用大量内存(数据库中有超过20,000行)。
编辑:感谢您提供一些简洁的答案。理想情况下,我希望能够在所有列上运行查询,而不仅仅是查看W,D或L.一个更复杂的例子是“找到所有结果,主队赢得他们之前的五个家中的每一个至少两个目标的客场比赛和客场球队至少有一个进球失去了他们的客场比赛。“
答案 0 :(得分:2)
如果您希望此功能良好,您应该在表格中链接连续结果,例如。有一个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
EDIT。
为了进一步改进这一点,您还可以使用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
如果你想找到所有曾经赢过之前比赛的球队,这是一个很好的方法,因为现在你可以简单地从where子句中省略r1.home_team_id = ID
,并且它应该每个给你一行赢得前两场比赛的球队。
答案 1 :(得分:2)
根据您需要的全部查询,我可能会考虑进行非规范化。 例如在团队表中添加
等列home_performance = 'WWDLWW'
away_performance = 'WWLLWL'
overall_performance = 'WWWWDLLLWWWL'
然后可以通过
来回答adhoc查询,例如赢得他们最近的2场主场比赛home_performance LIKE '%WW'
或者连续赢得4次将是overall_performance LIKE '%WWWW%'
可以使用GROUP_CONCAT