2017-10-10 9 views
2

저는 MySQL을 처음 접했으므로 잠재적 인 실수를 경험할 수 있습니다. 다른 멤버십 하위 유형과 각 하위 유형이 지정된 요일에 시간당 체크인 한 횟수를 표시하는 쿼리를 만들어야합니다. 여기까지 내가 지금까지 무엇을 생각해 냈습니다 :MySQL은 회원 당 1 시간 단위로 체크 인 횟수를 계산합니다.

SELECT 
customers.CUSTOMER_CUSTOM_TYPE AS Subtype, 
COUNT(CASE 
    WHEN checkins.POSTDATE BETWEEN '%17:00:00' AND '%17:59:59' THEN 1 
    ELSE 0 
    END) AS '5pm', 
COUNT(CASE 
    WHEN checkins.POSTDATE BETWEEN '%18:00:00' AND '%18:59:59' THEN 1 
    ELSE 0 
    END) AS '6pm', 
COUNT(CASE 
    WHEN checkins.POSTDATE BETWEEN '%19:00:00' AND '%19:59:59' THEN 1 
    ELSE 0 
    END) AS '7pm' 
FROM 
checkins, 
customers 
WHERE 
checkins.CUSTOMER_ID = customers.CUSTOMER_ID 
    AND checkins.POSTDATE LIKE '2017-10-05%' 
GROUP BY customers.CUSTOMER_CUSTOM_TYPE; 

간결하게 3 시간을 포함했습니다. POSTDATE 변경에도 불구하고 매 시간마다 동일한 번호가 계속 표시됩니다. 테이블의 설정이 올바른지 : 다른 간단한 쿼리에서

MySQL Membership Subtype Checkin/Hour

, 나는 주어진 기간에 대한 고객의 CHECKIN_ID을 계산하여 체크 인을 계산했습니다. 고객은 체크인 할 때마다 서로 다른 고유 한 체크인 ID를 부여 받게됩니다. 올바르게 처리하고 있습니까? 더 간단한 방법이 있습니까? 어떤 도움을 주셔서 감사합니다!

+0

'COUNT()'는 (SUM())이어야합니다. – Barmar

답변

0

올바른 join 구문을 사용하는 방법을 익히십시오. 쉼표는 from 절에 사용하십시오.

쿼리의 간단한 버전이 될 수 있습니다

SELECT cu.CUSTOMER_CUSTOM_TYPE AS Subtype, 
     SUM(hour(ch.POSTDATE) = 17) AS `5pm`, 
     SUM(hour(ch.POSTDATE) = 18) as `6pm`, 
     SUM(hour(ch.POSTDATE) = 19) as `7pm` 
FROM checkins ch JOIN 
    customers cu 
    ON ch.CUSTOMER_ID = cu.CUSTOMER_ID 
WHERE DATE(ch.POSTDATE) = '2017-10-05' 
GROUP BY cu.CUSTOMER_CUSTOM_TYPE; 

주 :

  • 사용 테이블 별칭을. 따라서 쿼리를 더 쉽게 작성하고 읽을 수 있습니다.
  • 날짜와 시간에 문자열 비교를 사용하지 마십시오. 비교할 날짜를 추출합니다 (해당 열에 색인이있는 경우 대안이 있습니다).
  • LIKE 패턴이 BETWEEN과 작동하지 않습니다. 나는 더 간단하게 HOUR()으로 바꿨다.
  • 숫자 문맥에서 부울 식을 숫자로 처리하는 MySQL 바로 가기를 사용하므로 case은 필요하지 않습니다.
0

현재 테이블의 구조에 너무 익숙하지 않은 경우이 정보를 크게 단순화 할 수있는 데이터 구조의 재 설계를 제안 할 수 있습니다.

정보의 세 가지 주요 점 (예 : customer_id, roomcheck_in_time)을 추적하는 것처럼 보입니다. 그런 다음 checkin_id을 언급하면이 테이블에 삽입 할 때 생성되는 PRIMARY KEY 값이 될 수 있습니다. 이 정보를 시간순에 차트와 같은 테이블로 정렬하는 대신,이 세 가지 데이터를 추적하는 데 큰 가치가 있습니다.

다음은 많은 경우가 아니라 GROUP BY 문을 사용합니다. 이 모든 시간 모든 객실에 대한 시간당 체크 인의 수를 반환합니다

SELECT count(*) as num, hour(check_in_time) as hr 
FROM checkins 
Group By room, hr 

: 방으로 서술 할 필요의 경우, 다음 시간은 이런 작은 선물을 보일 것이다. 일 또는 년으로 나누기를 원하면 Select 및 Group 문에 시간 기능을 추가하기 만하면됩니다.