0

我在我的网络系统中记录错误,人们可以从任何地方登录,例如下载我共享的内容;家庭照片,文件 ++。

这是一个矫枉过正的系统,但作为开发人员,我认为这很有趣 :D

在我的错误表中,我具有以下结构: DataTime Userid(int) IP(varchar) ErrorMessage(text)

在我的 persontable 中,我有以下结构: Id(int) Firstname(varchar) Lastname(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 上对“离开”同一个人进行分组。

4

2 回答 2

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;
于 2012-04-18T09:52:05.870 回答
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

如果您确切地指定它是什么,我们将能够为您提供更多帮助。

于 2012-04-18T09:55:59.100 回答