programing

올바른 결과를 반환하지 않음으로써 그룹이 포함된 MySQL 수

shortcode 2023. 1. 8. 14:43
반응형

올바른 결과를 반환하지 않음으로써 그룹이 포함된 MySQL 수

저는 보고서를 작성하려고 하는 티켓팅 시스템을 가지고 있습니다.사용자당 티켓 수를 터치하려고 합니다.이 첫 번째 쿼리에서:

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;

특정 사용자에 대해 터치된 티켓을 나열하고 수동으로 계산할 수 있습니다.

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

하지만 WHERE 사용자를 삭제하려고 하면ID= 문을 사용하여 다음과 같은 하위 쿼리로 사용해 보십시오.

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;

잘못된 카운트가 표시됩니다.

UserID  count
9       2
28      1
31      1
42      1
80      5
95      1
99      6
108     4
116     12
117     26
123     24

보시는 바와 같이 User의 카운트ID 80은 11이어야 합니다. 다른 결과들도 대부분 틀렸습니다. 모두 제가 예상했던 것보다 낮은 수치인 것 같습니다.

서브쿼리에서 GROUP BY/COUNT를 사용할 때 잘못하고 있습니까?원하는 결과를 얻기 위해 쿼리를 변경하려면 어떻게 해야 합니까?

집계만 원하십니까?

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

데이터에 특정 사용자에 대해 동일한 티켓이 여러 번 표시될 수 있는 경우COUNT(DISTINCT)보다 적절합니다.

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

사용자당 티켓 수를 터치하려면 다음 사항에 대한 적절한 쿼리부터 시작합시다.

SELECT count(*) as N, UserID
FROM dcscontact.ticketevents
WHERE EventDateTime BETWEEN '2016-06-22' AND '2016-06-23'
GROUP BY UserID;

A GROUP BY절은 항상 에 기재되어 있는 모든 비필수 컬럼을 포함해야 합니다.SELECT절을 클릭합니다.티켓 ID와 티켓 수(사용자 1인당)를 묻는 건 말이 안 돼!

또한 SQL 표준에는ORDER BY는 서브쿼리에 적용할 수 없습니다.생각하기에 가장 좋은 것ORDER BY조회에 사용되는 정보가 아니라 출력을 보기 위한 편의성입니다.

또, 그 유저에 대해서도 알고 싶은 것이 있습니다.TicketID그리고.EventDateTime티켓 카운트 아이디를 요구할 수는 없지만 첫 번째 티켓과 마지막 티켓은 받을 수 있습니다.같은 시간:

SELECT   count(*) as N
       , min(TicketID) as T1
       , max(TicketID) as Tn
       , min(EventDateTime) as E1
       , max(EventDateTime) as En
   , UserID
FROM dcscontact.ticketevents
WHERE EventDateTime BETWEEN '2016-06-22' AND '2016-06-23'
GROUP BY UserID;

가장 빠른 시간이 가장 작은 티켓의 시간이 아닐 수 있습니다.ID. 각 사용자의 첫 번째 티켓에 대한 모든 정보와 카운트를 얻으려면 다음 두 가지 정보 소스에 참여하십시오.

select N.N, T.* 
from dcscontact.ticketevents as T
join (
    SELECT count(*) as N, min(TicketID) as T1, UserID
    FROM dcscontact.ticketevents
    WHERE EventDateTime BETWEEN '2016-06-22' AND '2016-06-23'
    GROUP BY UserID;
) as N
on  T.UserID = N.UserID 
and T.TicketID = N.TicketID
-- and maybe others, according to the key
order by EventDateTime DESC

언급URL : https://stackoverflow.com/questions/37998642/mysql-count-with-group-by-not-returning-correct-result

반응형