2016-11-09 31 views
0

我有一个问题,结合SQL查询应该显示我最近(前一个和下一个)从CURDATE()日期。SQL查询得到最近的前一个和下一个日期?

我有表与客户表女巫事件

表与客户:

konto_odbiorcy | name 
---------------+---------------- 
2    | Sony LTD 
3    | Panasonic LTD 
etc... 

这是我已经得到了在表事件:

number | date 
-------+------------- 
2  | 2016-11-01 
2  | 2016-11-06 
2  | 2016-11-14 
3  | 2016-11-02 
3  | 2016-11-21 
3  | 2016-11-26 

我需要知道什么是最近的过去日期和下一个最近的未来日期,如:

number | date past | date future 
-------+-------------+------------- 
2  | 2016-11-06 | 2016-11-14 
3  | 2016-11-02 | 2016-11-21 

正如你看到的,对于number=3告诉我2016-11-212016-11-26

当我想表明过去的最近日期:

SELECT number, date AS past 
FROM 3ce_event 
WHERE date <= CURDATE() 

为下一个事件:

SELECT number, date AS future 
FROM 3ce_event 
WHERE date >= CURDATE() 

现在如何比较这两与我的客户表在一个SQL查询?

编辑

我改变了我的查询迈克答案:

select 
    number, klienci_ax_all.nazwa, miasto, 
    max(case when date<=curdate() then date end) as date_past, 
    min(case when date>=curdate() then date end) as date_future 
from 3ce_event 
inner join klienci_ax_all on 3ce_event.number = klienci_ax_all.konto_odbiorcy 
group by konto_odbiorcy 

看起来非常好,但我有问题,我的客户表(klienci_ax_all)。如果对于一个或多个客户,3ce_event表中没有任何内容,我没有将此客户记为Null date_past和Null date_future。

我需要从klienci_ax_all的客户的完整列表,然后过去和未来的数据,如果存在...任何帮助?要做到这一点

回答

1
select number, 
     max(case when date<=curdate() then date end) as date_past, 
     min(case when date>=curdate() then date end) as date_future 
    from event 
group by number 
+0

我编辑了我的文章...你能检查吗?我想我乱搞JOIN选项:( –

+0

@ Triple_6将'INNER JOIN'改为'RIGHT JOIN' – Mike

+0

我知道:)。非常感谢您的帮助!现在是完美的。 –

1

一种方法是自我加入到活动产生的子集的最小/最大每一日期,每组..

SELECT E.Number, E2.LTDate as `Date Past`, E1.GTDate as `Date Future` 
FROM Events E 
LEFT JOIN (SELECT number, min(date) GTDate 
      FROM events 
      WHERE date >= CurDate 
      GROUP BY Number) E1 
on E.Number = E1.Number 
LEFT JOIN (SELECT number, Max(date) LTDate 
      FROM events 
      WHERE date <= CurDate 
      GROUP BY Number) E2 
on E.Number = E2.Number 

另一种方法是使用相关联的查询(选择W /在选择)找到最小/最大

SELECT E.Number 
    , (Select max(E1.date) from events E1 where E1.Number = E.Number and E1.date<=sysdate) 
    , (Select min(E1.date) from events E2 where E2.Number = E.Number and E2.date>=sysdate) 
FROM Events E 

我多为第一次的做法风扇的,因为它不具备执行3个查询在事件表中的每个记录;但是对于较小的数据集,第二个数据集可能会更快。

相关问题