Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 带生效日期的左连接_Mysql_Sql_Left Join - Fatal编程技术网

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