[英]Join + date condition in SQL query
我在数据库中有两个表: Events和Dates ,它们之间是一对多的关系( 1个事件可以沿许多日期发生 )。
我想查询数据库以获取将来的将来事件,例如:
我正在使用简单的联接查询数据库,以获取过去事件的适当结果(限制为不返回没有日期的事件)。 但是,对于未来事件的查询有些棘手,因为还必须返回没有日期的事件。 我愿意接受任何建议。
到目前为止,我的尝试:
对于过去的活动(可以正常运行):
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的尝试无效,因为它还会返回过去的事件,没有日期信息(每个字段都为NULLED))。
提前致谢。
首先,正如您对它们的布局一样,您的查询不需要GROUP BY
子句,因为没有完成聚合(没有count
, max
等)。
您必须将“连接逻辑”和“条件逻辑”分开,所以我建议:
过去的事件:
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
如果事件表中的记录在日期表中始终有一条记录,则可以使用
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
我想我不明白为什么过去的事件也没有日期。
我什至没有看过“过去事件”的查询,因为您说还可以。
对于将来的事件,请尝试如下操作:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.