在 SQL 查询中加入 + 日期条件

Join + date condition in SQL query

我在数据库中有两个表:EventsDates,它们之间是一对多的关系(1 个事件可以在多个日期发生)。

我想查询数据库以获取未来和过去的事件,如下所示:

我正在使用简单的连接查询数据库,获取过去事件的适当结果(限制为不 returning 没有日期的事件)。然而,未来事件的查询有点棘手,因为没有日期的事件也必须 returned。我愿意接受任何建议。

到目前为止我的尝试:

过去的事件(工作正常):

SELECT dates.*, events.*,
FROM events
JOIN dates on (events.eventID = dates.eventID AND dates.date < CURDATE())
GROUP BY events.eventID
ORDER BY events.eventID ASC

未来活动: ???

SELECT dates.*, events.*,
FROM events
LEFT JOIN dates on (events.eventID = dates.eventID AND dates.date >= CURDATE())
GROUP BY events.eventID
ORDER BY events.eventID ASC

(我知道我对 LEFT JOIN 的尝试无效,因为它 return 也是过去的事件,没有日期信息(每个字段都为 NULLED))。

提前致谢。

首先,按照您的布局,您的查询不需要 GROUP BY 子句,因为没有进行聚合(没有 countmax 等).

你必须把"join logic"和"condition logic"分开,所以我建议:

过去的事件:

SELECT dates.*, events.*
FROM events
JOIN dates on (events.eventID = dates.eventID)
WHERE dates.date < CURDATE()
ORDER BY events.eventID ASC

未来活动:

SELECT dates.*, events.*
FROM events
LEFT JOIN dates on events.eventID = dates.eventID
WHERE dates.date >= CURDATE()) OR dates.date IS NULL
ORDER BY events.eventID ASC

如果事件 table 中的记录总是在日期 table 中有记录,那么您可以使用

SELECT dates.*, events.*,
FROM events
JOIN dates on (events.eventID = dates.eventID AND NVL(dates.date, CURDATE()) >= CURDATE())
GROUP BY events.eventID
ORDER BY events.eventID ASC

我想我不明白为什么过去的事件也没有日期。

我什至没有看"Past Events"的查询,因为你说没问题。

对于未来的事件之一,尝试这样的事情:

SELECT 
    `events` . *, `dates` . *, MAX(`dates`.`date`) as `maxDate`
FROM
    `events` AS `events`
        LEFT JOIN
    `dates` AS `dates` ON (`events`.`eventID` = `dates`.`eventID`)
GROUP BY `events`.`eventID`
HAVING `maxDate` >= CURDATE()
    OR `dates`.`date` IS NULL
ORDER BY events.eventID ASC;