MySQL - 如果可用则使用列中的数据,否则使用另一列

时间:2017-03-07 13:03:34

标签: php mysql pdo

我有一个用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 “使用结束日期(如果可用),否则使用开始日期”。它可以节省在初始查询期间可以完成的事情。

希望有所帮助。

1 个答案:

答案 0 :(得分:4)

COALESCE应该完全按照你的需要做。

您只需传递一系列值/字段,然后返回第一个非空值。

所以你的查询将包含:

 AND COALESCE(courses.end_date,courses.start_date) < CURDATE()