2017-08-28 67 views
-2

表1包含所有數據記錄:從表插入到表2 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 
. 
. 

我需要表現出不同形式的這個數據,所以我可以在web界面 打印出來我如何可以插入表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

你到目前爲止嘗試過什麼?請發佈您的查詢 – etsa

+4

這似乎是對https://stackoverflow.com/q/45914837/1415724的轉發,它應該可能會以完全重複的方式關閉,因爲它會收到答案。 –

回答

1

好吧,所以你是新來的查詢,並不像許多查詢那麼簡單。 Here is a SQLFiddle of your sample

首先,因爲您沒有指示哪個問題出現在哪個問題上,所以這是隱含的,它們在第一次點擊時解析,首先解析相應的主機。

現在,表列名稱。如果可以的話,儘量避免使用表格名稱和保留字的列名,否則可能妨礙它們。 (觸發器,例如日期)。

現在,看看你需要解決的問題。對於每個問題(最外面的WHERE子句),您需要找到與該問題/主機對應的第一個「確定」。所以在這裏,我使用同一張表3次,但使用不同的「別名」名稱引用,所以我知道哪一個是哪個(通過tProb,tOk,tChk)。

問題和Ok之間的左連接是因爲並非所有問題都可以解決。如果沒有找到相應的Ok記錄,這將允許問題顯示爲OPEN。連接條件本身相當簡單...加入相同的主機名。

但是,ID的連接的第二部分是棘手的。在這裏,它是一個相關的子查詢(通常是性能殺手)。對於每個問題,您需要找到該主機的第一個(通過MIN)ID,並且該狀態爲OK狀態,且該ID大於問題的ID。您不希望將ID = 2的OK與ID = 3的PROBLEM關聯。通過使用MIN(),您將只能保證一個條目(如果有)。

最後,COALESCE()的字段選擇是爲了從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 

爲了幫助簡化此查詢,最好在問題ID的表格中添加另一列。輸入解決方案條目時,應在其中插入問題ID作爲基礎。不一定是對原始問題進行反標的要求,只是解決方案以確定它是從隊列中解決的問題。

+0

非常感謝@DRapp這正是我想要的,我會測試它 – wael

+0

它的作品非常魅力非常感謝你@DRapp !!!! – wael

+0

@wael,很高興幫助。此外,請點擊答案旁邊的複選框,以便其他人知道已經解決並幫助其他人進行類似的搜索。過去有一個鏈接網站禮儀發佈問題,標記爲答案,上/下投票也。將來,如果您需要,請在某人提出要求時修改/修改您的原始帖子。然後讓那個人知道你修改了而不是插入像這樣的評論。 – DRapp

0

從現有表複製部分數據到新的一個,你用在SELECT聲明WHERE條款如下:

CREATE TABLE new_table 
SELECT col, col2, col3 
FROM 
    existing_table;