2017-08-28 7 views
-2

から表2に挿入します。私は私がに挿入することができますどのようにWebインターフェイス でそれを印刷できるように、さまざまな形でこのデータを表示する必要が私はすべてのデータのログが含まれている<strong>TABLE1</strong>持っ表1

id hostname  trigger  date 
1 10.10.10.1 PROBLEM 2017-08-04 14:10 
2 10.10.10.1 OK   2017-08-04 14:56 
3 10.10.10.1 PROBLEM 2017-08-04 15:42 
4 10.10.10.1 OK   2017-08-04 15:43 
5 10.10.10.2 PROBLEM 2017-08-09 01:19 
6 10.10.10.2 OK   2017-08-09 01:58 
. 
. 

テーブルから表2データ1ので、 次のようになります。

id hostname  triprob datpro   triok   dateok 
1 10.10.10.1 PROBLEM 2017-08-04 14:10 OK   2017-08-04 14:56 
2 10.10.10.1 PROBLEM 2017-08-04 15:42 OK   2017-08-04 15:43 
3 10.10.10.2 PROBLEM 2017-08-09 01:19 OK   2017-08-09 01:58 
.  

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

+1

あなたがここには努力を示さなかったが、何よりますと、あなたの問題がはびこっているということです予期しないエッジケースを伴う。あなたの出力のグループ化のロジックを説明してください。 –

+0

これまでに何を試しましたか? Plsはあなたの質問を投稿します – etsa

+4

これはhttps://stackoverflow.com/q/45914837/1415724の再投稿と思われ、答えを受け取ったので、おそらく正確な複製として閉じられるべきです。 –

答えて

1

あなたは新しいクエリを使用しているため、多数のクエリと同じくらい単純ではありません。 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をその根拠として挿入する必要があります。必ずしも元の問題をバックスタンプする必要はありません。キューから解決した問題を特定するソリューションです。新しいものに、既存のテーブルから一部のデータをコピーするには

+0

ありがとうございます@DRappこれはまさに私がテストしたいものです – wael

+0

魅力のように動作します@DRapp !!!!! – wael

+0

@ wael、喜んで助けてください。また、回答の横にあるチェックボックスをクリックすると、他の人はそれが解決されたことを知り、同様の検索をして他の人を助けます。以前は、質問を投稿したり、回答としてマークしたり、投票をアップ/ダウンしたりするためのサイトエチケットのリンクがありました。将来的には、必要に応じて、元の投稿を変更/改訂で編集してください。次に、このようなコメントにプラグインするのではなく、修正したことを知らせます。 – DRapp

0

、次のようにSELECT文でWHERE句を使用します。

CREATE TABLE new_table 
SELECT col, col2, col3 
FROM 
    existing_table; 
関連する問題