繁体   English   中英

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

[英]Join + date condition in SQL query

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

我想查询数据库以获取将来的将来事件,例如:

  • 查询以获取将来的事件应返回日期> = CURDATE()的每个事件以及尚未分配日期的事件 ...
  • 查询过去的事件应仅返回分配了至少一个日期的事件,该日期应比CURDATE()晚。

我正在使用简单的联接查询数据库,以获取过去事件的适当结果(限制为不返回没有日期的事件)。 但是,对于未来事件的查询有些棘手,因为还必须返回没有日期的事件。 我愿意接受任何建议。

到目前为止,我的尝试:

对于过去的活动(可以正常运行):

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子句,因为没有完成聚合(没有countmax等)。

您必须将“连接逻辑”和“条件逻辑”分开,所以我建议:

过去的事件:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM