2014-03-26 6 views
0

당 최대 값으로 여러 테이블에서 선택 결합 :의 우리가나는 다음과 같은 문제를 해결하기 위해 며칠 동안 노력하고 그룹

테이블 사용자

user_id, credit 

테이블 속성이 있다고 가정하자

property_id, user_id, check_interval 

개의 테이블 states_ (연도) (예 : 여러 테이블 - 2010 년부터 매년 하나씩 - states_2010 - 응용 프로그램이 태어 났을 때)

property_id, timestamp 

뒤에있는 논리는 각 사용자마다 하나 이상의 속성이 있다는 것입니다. 각 속성에는 하나 이상의 상태가 있습니다. 각 상태는 타임 스탬프에서 얻은 것입니다. 상태는 특정 시간마다 한 번씩 얻어지며 check_interval은 각 속성에 따라 다릅니다. 각 상태를 얻는 것은 각 사용자에게 사용자 계정 (테이블 사용자)에서 공제되는 1 크레딧을 소비합니다.

내 목표는 바로 앞으로 계획된 수표에서 시작하여 property_ids 및 다음 점검 시간 (각 property_id는 한 번만)으로 개요를 얻는 것입니다. 다음 점검 시간은 마지막 상태의 시간 소인 (즉, 모든 상태 _ (연도) 테이블의 max (시간 소인) + check_interval입니다. 이 개요에는 일부 크레딧 (예 : 크레딧> 0)이있는 사용자에게 속한 속성의 property_id 만 포함되어야합니다.

매우 가까운 질문 (Get max row per group from a related table)을 찾았지만 3 개의 테이블과 관련이 있으며 부분적으로 만 문제를 해결하고 있습니다. 필자의 경우, 사용자의 신용 및 여러 주 (년) 테이블이 복잡해지며, 이는 내가 깰 수없는 것입니다.

+0

CHECK_INTERVAL의 값이 무엇인가의 변화를 시도 재산

SELECT property_id, MAX('timestamp') AS most_recent FROM super_states GROUP BY property_id; 

3 단계마다 가장 최근의 타임 스탬프를 보여줍니다 부질? (일, 월, 기타) – AgRizzo

+0

Check_interval은 초 단위입니다. –

답변

0

보기를 사용하여 state_ [year] 난이도를 극복하려고 시도 할 수 있습니다. 피드백

단계 1.보기 후 - -

CREATE VIEW super_states AS 
SELECT property_id, `timestamp` FROM states_2013 
UNION 
SELECT property_id, `timestamp` FROM states_2012 
UNION 
SELECT property_id, `timestamp` FROM states_2011; 

다음이 SQL

SELECT properties.property_id 
    , DATE_ADD(states.most_recent, properties.check_interval SECONDS) AS Next_Time 
FROM properties 
JOIN users 
    ON properties.user_id = users.user_id 
LEFT JOIN (SELECT property_id, MAX(timestamp) AS most_recent 
      FROM super_states 
      GROUP BY property_id) AS states 
    ON states.property_id = properties.property_id 
WHERE users.credit > 0; 

편집을 시도 {필요에 따라 계속}이 좋아 보입니까 ?

SELECT * FROM super_states LIMIT 20; 

단계 2. 솔루션

SELECT properties.property_id 
    , states.most_recent AS most_recent 
    , properties.check_interval AS seconds_to_next_check 
    , DATE_ADD(states.most_recent, properties.check_interval SECONDS) AS Next_Time 
FROM properties 
JOIN users 
    ON properties.user_id = users.user_id 
LEFT JOIN (SELECT property_id, MAX(`timestamp`) AS most_recent 
      FROM super_states 
      GROUP BY property_id) AS states 
    ON states.property_id = properties.property_id 
WHERE users.credit > 0; 
+0

팁 주셔서 감사! 그러나 Next_Time은 비어있는 것 같습니다. 나는 이유를 모른다. 이러한 복잡한 쿼리에 대해서는 경험이 거의 없지만 most_recent가 나중에 (코드 행 6) 사용 된 것 (코드 행 2)보다 정의 되었기 때문에 그럴 수 있습니까? –

+0

사실 (필자는 완벽 함을 암시하는 것은 아니지만 그 코드는 유효한 SQL로 간주되며 정의되지 않은 경우 쿼리에서 약간의 오류가 발생합니다.) 쿼리를 구성 요소로 분해하여 실행할 수 있으며 일부 가난한 가정을했는지 확인할 수 있습니다.그것은 또한 backticks 문제가 될 수 – AgRizzo

+0

고마워! 나는 테스트를 통해 문제가 어떻게 든 DATE_ADD 함수와 관련이 없으며 어떤 에러도 발생시키지 않는다는 것을 발견했다. 성능이 DATE_ADD를 사용하는 것이 더 좋은지는 알 수 없지만 두 가지 숫자를 간단하게 합산하는 데 목적이 있습니다. 위에 추가 된 작업 솔루션. –

관련 문제