Mysql 带生效日期的左连接
我有两张桌子。一个表包含事件,另一个表包含一组用户的生效日期Mysql 带生效日期的左连接,mysql,sql,left-join,Mysql,Sql,Left Join,我有两张桌子。一个表包含事件,另一个表包含一组用户的生效日期 user_id | date_effective | rate U1 2015-01-01 08.00 U2 2015-01-01 09.00 U1 2015-02-01 10.00 U2 2015-02-01 11.00 U1 2015-03-01 12.00 event_id | date_event
user_id | date_effective | rate
U1 2015-01-01 08.00
U2 2015-01-01 09.00
U1 2015-02-01 10.00
U2 2015-02-01 11.00
U1 2015-03-01 12.00
event_id | date_event
E1 2015-01-15
E2 2015-02-15
E3 2015-03-15
我正在为特定用户附加的每个事件以及该用户事件的生效日期提取一份报告。对于U1,它看起来是这样的
event_id | date_event | rate
E1 2015-01-15 08.00
E2 2015-02-15 10.00
E3 2015-03-15 12.00
我认为生效日期需要按升序排序,以便我可以选择左连接上的第一个,这是默认行为。我遇到的问题是,这样做时,它不允许我订购生效日期:
SELECT event.event_id, event.event_date, effective.rate
FROM event
LEFT JOIN effective ON effective.user_id=U1
ORDER BY effective.date_effective ASC
我尝试的另一种方法是在左Join的ON子句中使用比较运算符,但这不起作用。真没想到会这样
如有任何建议,将不胜感激
编辑要求:对于任何事件日期,都需要向后看,找到事件日期之前的第一个生效日期。如果今天发生的事件的生效日期为昨天,生效日期为一个月前,则应使用昨天的生效日期。我是否正确理解您的意思? 您希望给定的
用户id
提供第一个生效日期
带有子查询:
SELECT *
,date_effecitve = (SELECT top 1 date_effective
FROM effective
WHERE user_id = 'U1'
AND date_effective <= DATE_event
ORDER BY date_effective DESC)
,rate = (SELECT top 1 rate
FROM effective
WHERE user_id = 'U1'
AND date_effective <= DATE_event
ORDER BY date_effective DESC)
FROM event
结果user\u id=U2
event_id date_event date_effective rate
E1 15.01.2015 01.01.2015 9
E2 15.02.2015 01.02.2015 11
E3 15.03.2015 01.02.2015 11
编辑:
删除了我的加入代码,因为它是noch 100%正确。所以表1中的生效日期必须与给定用户的表2中的事件日期匹配?它们不一定匹配。如果生效日期为1月1日,生效日期为2月1日,则日期在2月1日之前的任何事件都应使用1月1日生效日期记录。好的,那么生效日期和事件日期的月份和年份应该匹配吗?你真的需要澄清需求,因为你的样本数据并不意味着你上面解释的内容。对不起。我添加了一个编辑上面与我认为是更明确的要求!我遇到的问题是,由于日期不匹配,我不知道如何查询它。我真的需要更多的警告,而不是=!
JOIN
版本可以处理此数据,但如果较早的条目具有更高的值(尝试交换两个条目),则会以静默和惊人的方式失败。您所寻找的功能相当于一个FIRST()。您可能会幸运地找到一种方法来获得date\u有效的(独占)上限,即在常规范围条件下加入。谢谢,朋友们!这就像预期的一样,是我没有想到的!
event_id date_event date_effective rate
E1 15.01.2015 01.01.2015 9
E2 15.02.2015 01.02.2015 11
E3 15.03.2015 01.02.2015 11