2016-11-19 6 views
-1

まず第一に、私はSQLは、私はそれにかなり新しいですが、ここで行くように、私はこのの大半を取るべきであっても、ルートであるかどうかわからないんだけど:を選択し、複数の列と日付が一致最寄りの順

I日付の複数の列を持つデータベースを持っている、と、私は順番に最も近い対応する日付で行をつかみたいと思います。 私はPHPで情報を表示しています。

うまくいけば、これは私が後だかを説明します:

c_date = 0001/01/01; 

e_id | e_date_1 | e_date_2 | e_date_3 
-------------------------------------------- 
    0 | 0001/01/02 | 0001/01/15 | 0001/02/02 
-------------------------------------------- 
    1 | 0001/01/08 | 0001/01/12 | 0001/01/17 
-------------------------------------------- 
    2 | 0001/01/02 | 0001/01/13 | 0001/02/12 
-------------------------------------------- 
    3 | 0000/12/29 | 0001/01/01 | 0001/02/12 
-------------------------------------------- 
    4 | 0001/01/24 | 0001/02/01 | 0001/02/12 

0.1 & 2.1は、最初の列に最も近いですが、3.2は3の選択#1 0.1 & 2.1を作る0.2よりも近いが同じです、 3、2、0、1、4

:が、2.2などの2選択#2

ファイナルを作る0.2より近いです

誰かが正しい方向に私を助けることができますか?私はマニュアルとチュートリアルを行ってきましたが、私が探しているものを解決するものは何もありません。 私は間違った方法でデータを保存するつもりですか?よく分かりません。

ありがとうございました。

+0

「0.1」とは何ですか?どのような数式が「親密度」を定義していますか? –

+0

一般的に列を列挙したらいつでもデザインを再考する時期です – Strawberry

答えて

1

あなたの希望するデータ選択の論理は私には分かりませんが、あなたがしようとしていることはほとんどありませんが、データが正規化された形式であれば簡単に行うことができます。

異なる構造にデータを格納できる場合は、異なる日付列に対応する識別子を格納する単一の列を使用してデータ構造を正規化する必要があります。そのようなテーブルは、このように定義される:

が表e_dates( E_ID整数、 e_date_id整数、 e_date日付 )を作成します。

現在の表の最初の行は、値と、この正規化されたテーブルに3列に対応する: (0、1、0001/01/02) (0、2、0001/01/15) ( 0,3、0001/01/15)

1

これはあなたが望むものですか?

select e_id 
from ((select e_id, e_date_1 as e_date from t) union all 
     (select e_id, e_date_2 as e_date from t) union all 
     (select e_id, e_date_3 as e_date from t) 
    ) t 
group by e_id 
order by min(abs(datediff(c_date, d_date)); 

これは、3つの日付のうち最も近いものに基づいてe_idを返します。

関連する問題