올바른 결과를 반환하지 않음으로써 그룹이 포함된 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
'programing' 카테고리의 다른 글
왜 'DELimiter //'는 MariaDB에서 오류를 발생시키나요? (0) | 2023.01.08 |
---|---|
MySQL 오류 2006: mysql 서버가 사라졌습니다. (0) | 2023.01.08 |
ALTER TABLE Add Column에 시간이 오래 걸립니다. (0) | 2022.12.24 |
Ajax를 사용하여 @RequestBody의 여러 변수를 Spring MVC 컨트롤러로 전달 (0) | 2022.12.24 |
소스 파일을 더 이상 사용할 수 없습니다. (0) | 2022.12.24 |