SELECT COUNT(*) AS total
FROM (
SELECT DISTINCT User_ID
FROM UserClicks
WHERE Date BETWEEN DATE_SUB(:startDate, INTERVAL 1 MONTH) AND :startDate
) u1
WHERE EXISTS
(
SELECT NULL
FROM UserClicks u2
WHERE u2.User_ID = u1.User_ID
AND u2.Date BETWEEN :startDate AND :endDate
)
이 (User_ID, Date)
에 복합 인덱스를 만듭니다 :
CREATE INDEX ix_userclicks_user_date ON UserClicks (User_ID, Date)
당신이 가지고있는 경우도 날짜 열에서 인덱스를 추가하는 경우
SELECT COUNT(DISTINCT UserClicks.User_ID) AS total
FROM UserClicks
WHERE (UserClicks.Date BETWEEN :startDate AND :endDate)
AND (UserClicks.Date BETWEEN DATE_SUB(:startDate, INTERVAL 1 MONTH) AND :startDate)
도움이 될 사용자 수가 적지 만 클릭 수가 많고 표가 Users
인 경우 Users
을 사용할 수 있습니다. 테이블 대신 DISTINCT
는 :
SELECT COUNT(*)
FROM Users u
WHERE EXISTS
(
SELECT NULL
FROM UserClicks uc1
WHERE uc1.UserId = u.Id
AND uc1.Date BETWEEN DATE_SUB(:startDate, INTERVAL 1 MONTH) AND :startDate
)
AND EXISTS
(
SELECT NULL
FROM UserClicks uc2
WHERE uc2.UserId = u.Id
AND u2.Date BETWEEN :startDate AND :endDate
)
UserClicks.User_ID 필드가 고유하지 않고 색인이 생성되어 있습니까? 그러면 쿼리의 두 DISTINCT 부분을 제거 할 수 있습니다. 어쨌든, 나는 @Parrots가 당신의 대답을 아래에 가지고 있다고 생각합니다. – JMD
@andrew : 시작하기 전에 한 달 전과 시작일과 종료일 사이를 클릭 한 사람들이 정말로하고 싶은 일이 있습니까? (아래의 Quassnoi 주석을 참조하십시오.) – Hogan