私はかなり奇妙な問題に遭遇しました。私はmysqlデータベースで作業するには、次のサンプルデータを持っている:何が起こっているSQL:サブクエリに基づいて結果セットを制限する必要があります
|key| data| index | total | timestamp | | # | a | 1 | 2 | 2009-01-02 01:01:32 | | $ | b | 2 | 2 | 2009-01-02 01:03:32 | | % | c | 1 | 3 | 2009-01-03 01:01:32 | |^| d | 2 | 3 | 2009-01-03 01:04:32 | | & | e | 3 | 3 | 2009-01-03 01:02:32 | | * | f | 1 | 2 | 2009-01-05 01:01:32 |
は(ない私の制御下にある)別のプロセスは、データパケットを受信し、タイムスタンプを直接データベースにそれらを格納していることです到着時刻。パケットはバーストに到達するはずです... a、bは互いに近くに到着し、1と2のインデックスが付けられ、各パケットは送信されたパケットの総数を含みます。 keyは通常の自動インクリメントプライマリキーです。
私が必要とするのは、到着した最新のリストを表示するビューです(パケットのすべてが到着していない場合は部分リストが受け入れ可能です)。
上記のクエリの結果は、理想的には "f"にする必要がありますが、私はそれを行う方法は見ていません。私たちが別の方法でそれを得ることができないならば、 "a"と "f"を返すことは受け入れられるでしょう。つまり、select文で捕捉される少量の余分なデータは大きな問題ではありません。 "f"が到着する前の期間、正しい戻り値はc、d、eです。あなたのいくつかは、おそらくあなたは(少なくとも、MySQLで)LIMIT句でサブクエリを行うことができない、気付いてきたように
SELECT * FROM table WHERE total = ( SELECT total FROM table WHERE timestamp = ( SELECT MAX(timetamp) FROM table ) ) ORDER BY DESC timestamp LIMIT ( SELECT total FROM table WHERE timestamp = ( SELECT MAX(timetamp) FROM table )
:
私の一般的な考えはの線に沿っていました。誰もがこの問題を解決する別のアプローチを持っていますか?上記のクエリは、最近のIDの小さなリストにJOINを入れ子にすることで、よりきれいにすることができますが、サブクエリのLIMITサブクエリの問題は残ります。
2段階クエリとして、これは比較的簡単です。問題は、VIEWの定義文を定義する必要があることです。
編集私は示唆しています間違ったSQLの例を修正する
"最新"の構成を明確に説明できますか? "F"と "A"は受け入れられると言っているので、それはまっすぐなタイムスタンプのようには見えません。 –
私は、一意の「インデックス」値を保証し、「合計」行以上を返さないようにする方法を想定していました。基本的には、 "f"が返されることは重要ですが、 "a"を返すことも致命的な欠陥ではないと言っています。 – user73917
コレクションごとに識別子がないことは残念です。コレクションのスパンが2日以上ある場合や2つのコレクションが重複している場合は、問題が発生します。 – Adam