2012-03-18 12 views
0

構造の間の値の一定の差異を持つ行を取得する:私は3つの数字がある場合はID(int) | NUMBER(int) | CREATED_AT(date)行と私のテーブルの連続した日付を減少

は:10119を、私は、同じ割合で私のテーブルからすべての行を取得することができますNUMBERの値が連続して減少するCREATED_ATの日付?

例:

私の番号がある場合:10,11,9は...行は次のようになります。

NUMBER | CREATED_AT 
50  | 2012-03-18 
51  | 2012-03-17 
49  | 2012-03-16 

結果が

"50" でなければなりません

私の番号が50,40,60の場合:行は次のようになります:

NUMBER | CREATED_AT 
100 | 2012-02-20 
90  | 2012-02-19 
110 | 2012-02-18 

結果は "100"

でなければなりません...

私はこのために一日の半分を無駄に、私はまだどこから始めれば見当がつかない...

PS:私のテーブルには約5 000の行があります。

UPDATE

私は、PHPコードのビットとMySQLのクエリの多くでそれをやりました。スクリプトの実行時間:約6秒。 )=

+0

私は考えることのできない方法があるかもしれませんが、実際には、この種のクエリは、データベースが問題のより適切なものになるように再構成されない限り、非常に遅くなるでしょう。あなたは解決したい実際の問題は何ですか? – Jon

+0

少し質問を明確にすることはできますか?あなたの例では、50、51、および49はすべて 'NUMBER'の値ですか、それとも別のものですか? 「a(日付)、a + 1(日付-1)、a-1(日付2)」のパターン、または選択する必要があるデータにとって重要なパターンは、 –

+0

これは、すべての5000行を取得し、PHPループでそれを操作する – safarov

答えて

1

を[GoDaddyはデラックスホスティングでテスト]私はそれを自分でテストしていませんが、あなたはこの試みることができる: - number2のとnumber2の - number3

SELECT a.*,b.*,c.* 
FROM table_name a 
INNER JOIN table_name b 
ON b.NUMBER = a.NUMBER + $range1 and DATEDIFF(b.CREATED_AT, a.CREATED_AT) = 1 
INNER JOIN table_name c 
ON c.NUMBER = b.NUMBER + $range2 and DATEDIFF(c.CREATED_AT, b.CREATED_AT) = 1 

$range1を、$range2は、変数の数値1です。

+0

これはうまくいきますが、結果は得られません。 – John

+0

私は自分のテストデータベースをチェックしています。おそらくあなたの与えられたパターンであなたのテーブルにデータがありません – safarov

+0

私はテーブルの既存の数字で試してみましたが、それは行を与えません、私は再びそれをチェックします。 – John

1

例では、10,11、および9があります。したがって、t1.number = 10の場合、t2.number = t1.number + 1およびt3.number = t2.number-2.これは、この形式のクエリ -

SELECT t1.NUMBER 
FROM (SELECT 50 AS `first`, 40 AS `second`, 60 AS `third`) AS seq 
INNER JOIN `table` t1 
    ON `seq`.`first` <> t1.NUMBER 
INNER JOIN `table` t2 
    ON `seq`.`second` <> t2.NUMBER 
    AND t1.CREATED_AT - INTERVAL 1 DAY = t2.CREATED_AT 
    AND CAST(t1.NUMBER AS SIGNED) - CAST(t2.NUMBER AS SIGNED) = `seq`.`first` - `seq`.`second` 
INNER JOIN `table` t3 
    ON `seq`.`third` <> t3.NUMBER 
    AND t2.CREATED_AT - INTERVAL 1 DAY = t3.CREATED_AT 
    AND CAST(t2.NUMBER AS SIGNED) - CAST(t3.NUMBER AS SIGNED) = `seq`.`second` - `seq`.`third`; 

EDIT - これが原因結合条件に非常に効率的ではありませんが、それは問題ないはずです、このような小さなデータセットを与えられたネガ

に対処するためにCASTを追加しました。

関連する問題