2012-04-18 59 views
0

我在我的網絡系統中記錄錯誤,人們可以從任何地方登錄,例如下載我分享的東西;家庭照片,dokuments ++。我的分組是正確的,得到了​​缺少數據的感覺

這是一個矯枉過正的系統,但作爲一個開發者,我覺得很有趣:d

在我errortable我有以下結構: DATATIME用戶ID(int)的IP(VARCHAR)的ErrorMessage(文本)

在我的代碼PersonTable我有以下結構: ID(INT)名字(VARCHAR)姓氏(VARCHAR)

我要計算每個不同的錯誤數或錯誤,......但我覺得我做了一個錯誤,因爲同一個用戶可以有多個IP,一個IP可以有多個用戶。 SQL是以下內容:

SELECT TO_CHAR(DateTime, 'DD') DAY, 
     TO_CHAR(DateTime, 'MM') MONTH, 
     log.ErrorMessage, 
     CONCAT(CONCAT(person.lastname, ', '), person.firstname), 
     log.IP, 
     count(*) AS "COUNT" 
    FROM errorlog log 
    FULL JOIN person person 
    ON log.Userid = person.Id 
WHERE log.DateTime BETWEEN foo 
         AND foo2 
GROUP BY TO_CHAR(DateTime, 'MM'), 
      TO_CHAR(DateTime, 'DD'), 
      person.Lastname, 
      person.Firstname, 
      log.IP, 
      log.errormessage 
ORDER BY MONTH ASC, 
     DAY ASC; 

我認爲我的sql可能會將「同一個人」分組到不同的IP上。

回答

3

由於您在您的SELECT子句中包含了人名和IP地址,因此它將返回每個日期的每個IP地址每個錯誤消息的錯誤計數。

如果你只是想每個日期每錯誤信息的錯誤計數則忽略人的名稱和IP地址從查詢:

SELECT TO_CHAR(DateTime, 'DD') DAY, 
     TO_CHAR(DateTime, 'MM') MONTH, 
     log.ErrorMessage, 
     count(*) AS "COUNT" 
    FROM errorlog log 
    WHERE log.DateTime BETWEEN foo 
         AND foo2 
    GROUP BY TO_CHAR(DateTime, 'MM'), 
      TO_CHAR(DateTime, 'DD'), 
      log.IP, 
      log.errormessage 
ORDER BY MONTH ASC, 
     DAY ASC; 
0

您的查詢不會放棄錯誤的計數。它會在同一天爲相同的IP地址和用戶計算相同的錯誤消息。如果你想要的用戶列表,併爲他們的錯誤的計數,這是SQL(未經測試):

SELECT CONCAT(CONCAT(person.lastname, ', '), person.firstname), 
log.IP, ISNULL(count(log.DateTime), 0) AS "COUNT" 
FROM person 
LEFT OUTER JOIN errorlog log 
ON person.Id = log.Userid 
WHERE log.DateTime BETWEEN foo AND foo2 
GROUP BY person.Lastname, person.Firstname, log.IP 
ORDER BY person.Lastname, person.Firstname, log.IP 

如果指定它到底是什麼,我們將能夠幫助你更多。

相關問題