我有一个父对象,让我们说一个事件。
此事件可能发生在几个日期,因此我们有EventDates。
现在我希望活动的开始日期在日期范围内(例如学年)。
通常这很容易,但由于开始日期不是Event的直接属性,我们需要加入EventDates。
我已经尝试过以下(非正统)方法,这种方法似乎已经工作了一段时间,但突然之间不再有了:
SELECT *, min(ed_date) AS ed_date FROM events
LEFT JOIN event_dates ON events.e_id = event_dates.ed_event_id
WHERE ed_date >= '2016-09-01'
AND ed_date <= '2017-08-31'
显然,如果在上述范围内有一个EventDate,它将取该范围内的第一个作为&#34; min(ed_date)&#34;而不是实际的最短日期。
如果已经有解决方案,我必须错过它。 任何帮助表示赞赏。我不想使用php来查找所有单独的日期,并使用这些ID来对这些结果应用IN数组过滤器。
单独保存事件本身的开始日期也可能是一种选择,但我不喜欢冗余数据。
如果您有疑问或某些事情不清楚,请务必提问。
更新。 对于一些样本数据存在疑问,希望我能做到这一点:
table events:
e_id:int(11) e_category_id:int(11) e_title:varchar(255) e_status:int(11)
table event_dates:
ed_id:int(11) ed_event_id:int(11) ed_title:varchar(255) ed_date:date
让我们说有2个事件:E1&amp; E2。 (标题,类别和状态与此案例并不相关)
3个event_dates链接到每个事件
E1的日期:2017/05/05 - 05/05/2017 - 08/05/2017
E2的日期:2017/04/28 - 02/05/2017 - 04/05/2017
现在我希望所有活动的开始日期(分别为2017年5月3日和2017年4月28日)都在01/05 / 2017-31 / 05/2017的日期范围内。
如果我执行以下操作:
SELECT *, min(ed_date) as ed_date FROM events
LEFT JOIN event_dates ON event_dates.ed_event_id = events.e_id
WHERE ed_date >= '2017-05-01'
AND ed_date <= '2017-05-31'
GROUP BY events.e_id
(GROUP BY并未包含在上面的第一个选项中,道歉。)
然后我得到了两个事件,第二个事件的ed_date是02/05/2017。
它得到了该范围内的日期的最小值(ed_date)(03/05/2017和02/05/2017),而不是实际的最小值(ed_date)(03/05/2017&amp; 28) / 04/2017)。
这样清楚吗?