gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:45 25 4
gpt4 key购买 nike

我有一个用 PHP 构建并使用 PDO 与 MySQL 数据库对话的应用程序。

数据库有一张培训类(class)表。表的结构是这样的,有“开始日期”和“结束日期”DATE类(class)字段:

courses.start_date
courses.end_date

所有类(class)都有开始日期,但结束日期是可选的。这是因为类(class)可能会持续一个下午,或持续几天(例如 3 月 6 日至 8 日)。

我的申请中有 2 页列出了“近期类(class)”(在今天日期之后发生)和“过去的类(class)”(在今天日期之前发生)。

我唯一可以可靠使用的查询条件是基于 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 )它不会返回没有结束日期的类(class)的任何数据。例如,这不会工作:

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'

那门类(class)还没有结束;一直持续到明天。

在我的原始代码中,它只查询 courses.start_date所以应用程序会将其移至“过去的类(class)”页面,因为 2017-03-06是“今天之前”(< CURDATE())。我可以更改查询,以便它使用 courses.end_date这将满足我的需求。

但是并非所有类(class)都有结束日期,因此我不能简单地更改查询以使用它并以可靠的方式返回结果。例如当我们有

courses.start_date = '2017-03-06'
courses.end_date = NULL

因为没有courses.end_date,查询将无法工作。所以它甚至找不到这条记录。

给出的答案允许 MySQL “如果可用则使用结束日期,否则使用开始日期”。它避免了循环遍历事物,因为它可以在初始查询期间完成。

最佳答案

COALESCE 应该完全满足您的需求。

您只需向它传递一系列值/字段,它就会返回第一个不为空的值/字段。

因此您的查询将包含:

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

关于MySQL - 如果可用则使用列中的数据,否则使用另一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42649075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com