我在我的网络系统中记录错误,人们可以从任何地方登录,例如下载我分享的内容;家庭照片,dokuments ++。
这是一个矫枉过正的系统,但作为一名开发人员,我认为这很有趣:D
在我的错误中,我有以下结构: DataTime Userid(int)IP(varchar)ErrorMessage(文本)
在我的个人表中,我有以下结构: 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上“远离”同一个人。
答案 0 :(得分: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;
答案 1 :(得分: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
如果您准确指定它是什么,我们将能够为您提供更多帮助。