あなたは新しいクエリを使用しているため、多数のクエリと同じくらい単純ではありません。 Here is a SQLFiddle of your sample
最初に、問題がどの問題に対応するかについての指標がないため、最初のヒット時に解決され、それぞれのホストで最初に解決されることが暗示されます。
今、テーブルの列名。できれば、予約語である表名と列名を使用してAVOIDを試してみてください。 (トリガー、日付など)。
解決する必要がある問題を見てください。各問題(一番外側のWHERE句)について、その問題/ホストに対応する最初の "OK"を見つける必要があります。ここでは、同じテーブルを3回使用していますが、別の「エイリアス」という名前の参照を使用していますので、どのテーブルが(tProb、tOk、tChk経由で)どちらであるかわかります。
問題とOkの間の左結合は、すべての問題が解決されるわけではないためです。対応するOKレコードが見つからない場合、問題はOPENとして表示されます。結合条件自体は単純です...同じホスト名に参加してください。
ただし、IDの2番目の部分は難しいものです。ここでは、関連するサブクエリ(一般的にパフォーマンス・キラーです)です。問題ごとに、そのホストのFIRST(via MIN)IDが必要です。これはOKステータスであり、IDは問題のIDよりも大きいです。 ID = 2のOKをID = 3のPROBLEMに関連付ける必要はありません。MIN()を使用すると、1つのエントリしか保証されません。
最後に、COALESCE()のフィールド選択は、見つかった場合にokテーブルから値を取得することを識別することです。見つからない場合は、ディスプレイの空白のままにするか、OKステータスの場合は「 - まだ開く - 」を選択します。
SELECT
tProb.id as ProblemID,
tProb.hostName,
tProb.trigger as Problem,
tProb.date as ProblemDate,
coalesce(tOk.id, 0) as OkID,
coalesce(tOk.`trigger`, '- still open -') as OkStatus,
coalesce(tOk.`Date`, ' ') as OkDate
from
Table1 tProb
LEFT JOIN Table1 tOk
ON tProb.hostName = tOk.hostName
AND tOk.ID in
(select
MIN(tChk.ID) as ID
from
Table1 tChk
where
tChk.HostName = tProb.HostName
AND tChk.ID > tProb.ID
AND tChk.trigger = 'OK')
where
tProb.trigger = 'PROBLEM'
order by
tProb.id
このクエリを簡素化するために、problemIDのテーブルに別の列を追加することをお勧めします。解決策入力が入力されると、問題のIDをその根拠として挿入する必要があります。必ずしも元の問題をバックスタンプする必要はありません。キューから解決した問題を特定するソリューションです。新しいものに、既存のテーブルから一部のデータをコピーするには
あなたがここには努力を示さなかったが、何よりますと、あなたの問題がはびこっているということです予期しないエッジケースを伴う。あなたの出力のグループ化のロジックを説明してください。 –
これまでに何を試しましたか? Plsはあなたの質問を投稿します – etsa
これはhttps://stackoverflow.com/q/45914837/1415724の再投稿と思われ、答えを受け取ったので、おそらく正確な複製として閉じられるべきです。 –