2012-05-28 3 views
0

Facebook 애플리케이션 사용자 작업을 로깅하기위한 테이블이 있습니다. 특정 작업 ID에 대해 9 분이 경과하지 않은 최신 행을 가져 오려고합니다. 표는 다른 통계 정보의 열을 많이 가지고, 그래서 나는 단지 2 문제를 나타내는 행을 표시합니다 :타임 스탬프를 사용하여 로그 테이블에서 가장 최근 행을 선택하십시오.

나는 최신 행 actionID = 'cpf'지고 수행 할 작업을
timestamp     facebookID producerID  eventID actionID numOfTickets 
2012-05-28 13:16:38  100003286974944 9    1741  cpf  2 
2012-05-28 13:16:13  100003286974944 9    1741  cpf  4 

.

SELECT CONCAT_WS(' ', y.firstName, y.lastName) as fullName, x.facebookID, x.numOfTickets, MAX(x.timestamp) 
FROM E4S_ANALYTICS.e4s_analytic_data x INNER JOIN E4S_FB.e4s_user_details y ON x.facebookID = y.facebookID 
WHERE (x.actionID = 'CPF' AND x.numOfTickets > 0 AND x.producerID = 9 AND TIMEDIFF(NOW() , x.timestamp) < '00:09:00' 
AND x.facebookID IN (SELECT facebookID FROM E4S_FB.e4s_session_data WHERE 
        TIMEDIFF(NOW() , sessionStart) < '00:09:00')) 

쿼리의 결과는 다음과 같습니다 : 나는 무엇을 시도했다

이다

facebookID  numOfTickets MAX(x.timestamp) 
100003286974944 4    2012-05-28 13:16:38 

반환 된 타임 스탬프가 정확하지만 numOfTickets 4 대신의 2

입니다 참고 사항 : 내부 검색어 :

SELECT facebookID FROM E4S_FB.e4s_session_data 
WHERE TIMEDIFF(NOW() , sessionStart) < '00:09:00')) 

누가 응용 프로그램에 계속 로그인했는지 확인하는 데 사용됩니다.

답변

1
SELECT CONCAT_WS(' ', y.firstName, y.lastName) AS fullName, 
     x.facebookID, 
     x.numOfTickets, 
     x.timestamp 
FROM (
     SELECT * 
     FROM E4S_ANALYTICS.e4s_analytic_data 
     WHERE actionID = 'cpf' 
      AND numOfTickets > 0 
      AND producerID = 9 
      AND TIMEDIFF(NOW() , timestamp) < '00:09:00' 
      AND (facebookID, timestamp) IN (
        SELECT facebookID, MAX(timestamp) 
        FROM  E4S_ANALYTICS.e4s_analytic_data 
        WHERE actionID = 'cpf' 
         AND numOfTickets > 0 
         AND producerID = 9 
         AND TIMEDIFF(NOW() , timestamp) < '00:09:00' 
         AND facebookID IN (
          SELECT facebookID 
          FROM E4S_FB.e4s_session_data 
          WHERE TIMEDIFF(NOW() , sessionStart) < '00:09:00' 
          ) 
        GROUP BY facebookID 
       ) 
     ) AS x 
    INNER JOIN E4S_FB.e4s_user_details AS y USING (facebookID) 
+0

와우, 정말 고마워 !! 그것은 위대한 일하고, 나는 몇 가지 페이스 북의 ID로 이것을 시도하고 그 결과는 예상대로입니다. 이 쿼리에 대해 설명 할 시간이 있습니까? 그것은 내가 그것을 많이 배울 수있는 것 같습니다. 너무 복잡 할거라고 생각하지 않았습니다. 코멘트가 너무 길고 안락하다면 adleralon [at] yahoo.com으로 이메일을 보내주십시오. 그리고 다시 ... 많은 감사합니다! –

+0

@ Alon_A : 가장 안쪽의 하위 쿼리에서 시작하여 바깥 방향으로 작업합니다. 로그인 한 모든 ID를 선택한 다음 다른 바람직한 기준이 충족되는 분석 데이터의 최대 (최신) 타임 스탬프를 가져온 다음 모든 분석 데이터를 가져옵니다. 이러한 바람직한 기준이 충족되지만 시간 소인이 가장 최근의 항목 인 경우 사용자 세부 정보와 결합하여 궁극적으로 관심있는 열을 반환합니다. – eggyal

0

MAX()를 사용하지 않으셨습니까? JOIN 및 SUBQUERY 결과를 확인했다고 가정합니다.

SELECT CONCAT_WS(' ', y.firstName, y.lastName) as fullName, x.facebookID, x.numOfTickets, MAX(x.timestamp) 
FROM E4S_ANALYTICS.e4s_analytic_data x 
INNER JOIN E4S_FB.e4s_user_details y ON x.facebookID = y.facebookID 
GROUP BY x.facebookID 
WHERE (x.actionID = 'CPF' AND x.numOfTickets > 0 AND x.producerID = 9 AND TIMEDIFF(NOW() , x.timestamp) < '00:09:00' 
AND x.facebookID IN 
    (SELECT facebookID FROM E4S_FB.e4s_session_data 
     WHERE TIMEDIFF(NOW() , sessionStart) < '00:09:00')) 
ORDER BY x.timestamp DESC; 
+0

저는 MAX (x.timestamp)를 사용하고 있으며, LIMIT 1을 사용할 수없는 경우에는 조건에 맞는 페이스 북 ID가 많아서 모두 반환해야하기 때문에 사용할 수 없습니다. –

+0

위의 쿼리를 실행하면 (LIMIT없이) 결과가 어떻게됩니까? –

+0

정확한 날짜가있는 행 (2012-05-28 13:16:38) **하지만 ** 2 대신'numOfTickets'가 2 개 있습니다. 'numOfTickets' –

0

당신은 최신 첫번째에 따라 열을 주문하고 첫 번째 행을 선택 order by timestamp desc를 사용할 수 있습니다.
또는 max을 사용해보세요.

+0

MAX (x.timestamp)를 사용 중이므로 조건을 만족하는 페이스 북 ID가 많은 경우에 모두 반환해야하기 때문에 첫 번째 행만 선택 취소 할 수 없습니다. –

관련 문제