2016-11-09 61 views
0

私はCURDATE()からの最も近い(前と次の)日付を示すはずのSQLクエリを組み合わせることに問題があります。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-21ない2016-11-26私が一番近い日を過ぎ示したい

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

次のイベントのためにこれを比較する方法を今

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

2私の顧客テーブルを1つのSQLクエリで?私はマイク答えに私のクエリを変更

EDIT

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)との問題を抱えていました。 1人以上のお客様に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つのクエリを実行する必要はありませんとして第一のアプローチのためのファンの多くのです。しかし、より小さなデータセットでは2番目の方が高速になる可能性があります。

関連する問題