在 SQL 查询中加入 + 日期条件
Join + date condition in SQL query
我在数据库中有两个表:Events 和 Dates,它们之间是一对多的关系(1 个事件可以在多个日期发生)。
我想查询数据库以获取未来和过去的事件,如下所示:
- 获取未来事件的查询应该return每个事件的日期 >= CURDATE() 以及尚未分配日期的事件...
- 查询以获取过去的事件 应该return 只有至少分配了一个日期的事件应该早于 CURDATE()...
我正在使用简单的连接查询数据库,获取过去事件的适当结果(限制为不 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
子句,因为没有进行聚合(没有 count
、max
等).
你必须把"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;
我在数据库中有两个表:Events 和 Dates,它们之间是一对多的关系(1 个事件可以在多个日期发生)。
我想查询数据库以获取未来和过去的事件,如下所示:
- 获取未来事件的查询应该return每个事件的日期 >= CURDATE() 以及尚未分配日期的事件...
- 查询以获取过去的事件 应该return 只有至少分配了一个日期的事件应该早于 CURDATE()...
我正在使用简单的连接查询数据库,获取过去事件的适当结果(限制为不 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
子句,因为没有进行聚合(没有 count
、max
等).
你必须把"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;