MySQL在未知数量的日期间隔之间进行选择

时间:2010-11-09 16:12:31

标签: mysql

我目前有两个表,一个叫做游戏,另一个叫做回合。这是帮助的结构:

+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| id          | int(11)  | NO   | PRI | NULL    | auto_increment |
| schedule_id | int(11)  | NO   | MUL | NULL    |                |
| open_date   | datetime | NO   |     | NULL    |                |
| close_date  | datetime | NO   |     | NULL    |                |
| start_date  | datetime | NO   |     | NULL    |                |
| end_date    | datetime | NO   |     | NULL    |                |
+-------------+----------+------+-----+---------+----------------+

游戏

+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| id          | int(11)  | NO   | PRI | NULL    | auto_increment |
| schedule_id | int(11)  | NO   | MUL | NULL    |                |
| team_a      | int(11)  | NO   | MUL | NULL    |                |
| team_b      | int(11)  | NO   | MUL | NULL    |                |
| winner      | int(11)  | YES  | MUL | NULL    |                |
| date        | datetime | NO   |     | NULL    |                |
+-------------+----------+------+-----+---------+----------------+

现在圆桌会议是一系列具有指定日期范围的轮次,并且游戏是在圆形日期范围内设置的(但并非总是如此)。无论如何,我想要做的是在多个圆形间隔之间选择所有游戏。所以,如果我有三个圆形间隔,

round 1 - nov 13 to nov 15
round 2 - nov 20 to nov 25
round 3 - dec 1 to nov 10

如何在不执行多个SQL语句的情况下,仅选择这些日期之间的游戏。基本上我最终想要这样的东西:

SELECT * 
FROM games 
WHERE date BETWEEN round1.start_date AND round1.end_date OR
      date BETWEEN round2.start_date AND round2.end_date OR
      date BETWEEN round3.start_date AND round3.end_date

但我不知道我会有多少回合。我也不能使用最大一分钟,因为在我不想要的那些间隔之间可能有一些回合。现在我唯一的解决方案是我为所有轮次做一个选择,然后通过PHP对每个间隔做一个选择。我希望可能有更好,更有效的方法来实现这一目标。

希望这有意义并且谢谢!

更新

发布此问题后,我对这样的查询有了一个想法:

SELECT * 
FROM games INNER JOIN 
     rounds ON games.`date` BETWEEN rounds.start_date AND rounds.end_date

这样做有意义吗?它似乎有效,但我从来没有像那样加入,所以我不知道我可能会遇到什么样的效果。

1 个答案:

答案 0 :(得分:0)

你的更新非常接近......

select `games`.* from games join rounds on (`games`.`date` < `rounds`.`end_date` AND `games`.`date` > `rounds`.`start_date`);