MySQL通过不返回正确的结果来计数

Jon*_*lin 1 mysql sql group-by count mariadb

我有一个票务系统,我正在尝试在其上运行报告。我试图让每个用户接触的票数。使用第一个查询:

SELECT * FROM (
SELECT TicketID, UserID, EventDateTime
FROM dcscontact.ticketevents
WHERE EventDateTime BETWEEN '2016-06-22' AND '2016-06-23'
ORDER BY EventDateTime DESC) x
WHERE UserID=80
GROUP BY TicketID;
Run Code Online (Sandbox Code Playgroud)

我能够列出为特定用户触碰的工单,并且可以手动计算它们:

TicketID    UserID  EventDateTime
99168       80      6/22/2016 13:21
99193       80      6/22/2016 7:42
99213       80      6/22/2016 13:02
99214       80      6/22/2016 6:30
99221       80      6/22/2016 6:57
99224       80      6/22/2016 7:48
99226       80      6/22/2016 6:27
99228       80      6/22/2016 8:49
99229       80      6/22/2016 8:53
99232       80      6/22/2016 9:18
99237       80      6/22/2016 13:08
Run Code Online (Sandbox Code Playgroud)

但是当我尝试删除 WHERE UserID= 语句并尝试将其用作子查询时,如下所示:

SELECT UserID, COUNT(*) as count FROM (
    SELECT * FROM (
    SELECT TicketID, UserID, EventDateTime
    FROM dcscontact.ticketevents
    WHERE EventDateTime BETWEEN '2016-06-22' AND '2016-06-23'
    ORDER BY EventDateTime DESC) x
    GROUP BY TicketID) y
GROUP BY UserID;
Run Code Online (Sandbox Code Playgroud)

我得到不正确的计数:

UserID  count
9       2
28      1
31      1
42      1
80      5
95      1
99      6
108     4
116     12
117     26
123     24
Run Code Online (Sandbox Code Playgroud)

如您所见,UserID 80 的计数应该是 11。大多数其他结果也不正确,它们似乎都比我预期的要低。

在子查询上使用 GROUP BY/COUNT 时我做错了什么吗?如何更改我的查询以获得我想要的结果?

Gor*_*off 5

你只是想要一个聚合吗?

SELECT UserID, COUNT(*)
FROM dcscontact.ticketevents
WHERE EventDateTime BETWEEN '2016-06-22' AND '2016-06-23'
GROUP BY UserID;
Run Code Online (Sandbox Code Playgroud)

如果同一个工单可以多次出现在给定用户的数据中,COUNT(DISTINCT)则更合适:

SELECT UserID, COUNT(DISTINCT TicketID)
FROM dcscontact.ticketevents
WHERE EventDateTime BETWEEN '2016-06-22' AND '2016-06-23'
GROUP BY UserID;
Run Code Online (Sandbox Code Playgroud)