2011-12-20 5 views
0

"예"라고 표시된 테이블의 각 ID에 대한 마지막 행을 찾은 다음 해당 ID의 다음 인스턴스에 대해 동일한 테이블을 검색하여 해당 항목이 "아니오" ". 현재 이것은 두 번째의 where 절에서 첫 번째 쿼리의 결과를 사용하는 PHP foreach와 결합 된 쿼리에서 올바르게 작동합니다. 데이터 세트는 3000 개가 넘는 행에 불과하며 전체 프로세스는 4 분이 채 지나지 않아 비효율적입니다.MySQL의 상관 관계 서브 쿼리 도움말

나는 단지 하나의 기준이있는 경우에만 SQL을 사용하여이 작업을 수행 할 수 있음을 알고 있지만 두 가지 작업을 수행 할 때 벽을 치고 얻을 수있는 도움을 준 것으로 보인다.

미리 감사드립니다.

//Get max dispatchID where Available = 'Yes' 
    <?php $sql = "SELECT a.memberID, MAX(a.dispatchID) as lastDispatchIDYes 
       FROM members_availability a 
       WHERE available = 'Yes' 
       GROUP BY memberID"; 
    $qry = $this->db->query($sql);    
    foreach($qry->result() as $row){ 
     $sql2 = "SELECT dispatchID, memberID, 
        FROM members_dispatch WHERE memberID = '".$row->memberID."' AND dispatchID > '".$row->lastDispatchIDYes."' AND available = 'No'ORDER BY dispatchID ASC LIMIT 1"; 
     $qry2 = $this->db->query($sql2); 
     if($qry2->num_rows() > 0){     
      echo $row->memberID." switched availability at ".$row->dispatchID."<br />"; 
     }   
    } ?> 

답변

0

귀하의 문제를 해결하기위한 아이디어입니다.

이렇게하면 available = NO이고 dispatchID가 yes 인 마지막 행보다 큰 모든 행을 가져옵니다. 나는 당신이 필요로 이해한다면

+0

@Sheldon Pereira가 대답을 조금만 업데이트했습니다. – Zohaib

+0

Zohaib에게 감사의 말을 전합니다. 10 분이 지난 후이 쿼리 시간이 초과되었습니다. –

+0

성능 향상을 위해 열에 인덱스를 추가하는 것이 고려되었습니다. 귀하의 경우 memberId 및 available에 복합 인덱스가 도움이 될 수 있습니다. – Zohaib

0

, 나는이 쿼리 도움이 될 생각 :

SELECT `a1`.`memberID`, `a1`.`lastDispatchIDYes`, `b`.`dispatchID`, `b`.`available` 
FROM (SELECT `a`.`memberID`, MAX(`a`.`dispatchID`) AS `lastDispatchIDYes` 
FROM `members_availability` `a` WHERE `a`.`available` = 'Yes' 
GROUP BY `a`.`memberID`) `a1` 
INNER JOIN `members_availability` `b` ON `b`.`memberID` = `a1`.`memberID` AND `b`.`dispatchID` = `a1`.`lastDispatchIDYes` + 1; 
$qry = $this->db->query($sql);    
foreach($qry->result() as $row) { 
    echo $row->memberID . " switched availability at " . $row->lastDispatchIDYes . "<br />"; 
} 

또한, 질문에서 언급 한 코드 샘플에서 "에코"문에 문제가있을 것으로 보인다. $row->dispatchID은 결과 집합에서 유효한 값이 아닙니다. 나는 그것이 $row->lastDispatchIDYes이어야한다고 생각한다. 아니?

EDIT 1 :은 "아니오"항목이 dispatchID가 "Yes"인 마지막 항목의 dispatchID보다 큰 항목에 대해 쿼리를 업데이트 할 수 있도록 쿼리를 업데이트했습니다. 위의 원래 쿼리는 dispatchID가 바로 다음에 오는 "No"항목 만 읽습니다.

SELECT DISTINCT `a1`.`memberID`, `a1`.`lastDispatchIDYes` 
FROM (
    SELECT `a`.`memberID`, MAX(`a`.`dispatchID`) AS `lastDispatchIDYes` 
    FROM `members_availability` `a` 
    WHERE `a`.`available` = 'Yes' 
    GROUP BY `a`.`memberID` 
    ) `a1` 
INNER JOIN `members_availability` `b` 
    ON `b`.`memberID` = `a1`.`memberID` 
    AND `b`.`available` = 'No' 
WHERE `b`.`dispatchID` > `a1`.`lastDispatchIDYes`; 

희망이 있습니다.

+0

감사합니다 Abhay, 이것은 잘 작동하고 매우 빠르지 만 3 행만 반환했습니다. 약 1200 개가 있어야합니다. 아마도 그룹화 또는 조인이 올바르지 않습니다.이 작업을 계속하고 echo 문에서 catch에 대해 감사 할 것입니다. –

+0

@SheldonPereira, 그것이 효과가 있었다는 것을 알았습니다. 검색어에 제한이 없으므로 원하는 기준과 일치하는 행이 3 개 (즉, 최대 dispatchID가 "예"이고 그 다음 dispatchID가 "아니요"와 일치) 할 수 있습니다. 그러나 나는 데이터를 볼 수 없기 때문에 이것을 논평 할 수 없다. 언제든지 도움이 필요하면 알려 주시기 바랍니다 :-) – Abhay

+0

문제는 JOIN 기준이었습니다. b.dispatchID = a1.lastDispatchIDYes + 1을 사용했는데 실제로 b.dispatchID> a.lastDispatchIDYes가 필요했습니다 ... 그 수정 쿼리가 실행되지만 아주 느린, 나는 그것을 시작, 좋은 기지에서 시작, 감사합니다. –