我有一个用PHP构建的应用程序,它使用PDO与MySQL数据库通信。
数据库有一个培训课程表。该表的结构是这样的:课程的“开始日期”和“结束日期”DATE
字段:
courses.start_date
courses.end_date
所有课程都有开课日期,但结束日期是可选的。这是因为课程可能会在一个下午或一段时间(例如3月6日至8日)进行。
我的申请表中有2页,其中列出了“即将开课”(发生在今天的日期之后)和“过去的课程”(在今天的日期之前发生)。
我可以可靠使用的唯一查询条件基于courses.start_date
,因为该字段始终填充。所以我的查询过滤所在的部分如下所示:
if ($when == 'future') {
$sql .= " AND courses.start_date >= CURDATE()";
}
if ($when == 'past') {
$sql .= " AND courses.start_date < CURDATE()";
}
如果我更改条件以使用courses.end_date
(而不是start_date
),则不会返回没有结束日期的课程的任何数据。例如,不会工作:
courses.start_date = '2017-03-06'
courses.end_date = NULL
但是这个将起作用,因为它有一个结束日期:
courses.start_date = '2017-03-06'
courses.end_date = '2017-03-08'
我想知道是否可以使用SQL查询来使用end_date
(如果有),否则使用start_date
。由于应用程序已经在PHP中,我考虑循环我的数据并动态添加条件;但如果有一种纯粹的SQL方法,这似乎效率低下。
任何提示都将不胜感激。
我已经接受了一个完美无缺的答案。然而,有人评论并要求提供样本数据和预期结果。
立即考虑使用该应用程序(2017-03-07)。如果我们有
courses.start_date = '2017-03-06'
courses.end_date = '2017-03-08'
该课程尚未完成;它一直持续到明天。
在我的原始代码中,它仅在courses.start_date
上查询,因此应用程序会将其移至“过去的课程”页面,因为2017-03-06
是“今天之前”(< CURDATE()
)。我可以更改查询,以便使用courses.end_date
,这可以满足我的需求。
然而并非所有课程都有结束日期,所以我不能简单地更改查询以使用它并以可靠的方式返回结果。例如,当我们有
时courses.start_date = '2017-03-06'
courses.end_date = NULL
查询无效,因为没有courses.end_date
所以它甚至找不到此记录。
给出的答案允许MySQL “使用结束日期(如果可用),否则使用开始日期”。它可以节省在初始查询期间可以完成的事情。
希望有所帮助。
答案 0 :(得分:4)
COALESCE应该完全按照你的需要做。
您只需传递一系列值/字段,然后返回第一个非空值。
所以你的查询将包含:
AND COALESCE(courses.end_date,courses.start_date) < CURDATE()