簡體   English   中英

MySQL中的相關子查詢幫助

[英]Correlated Subquery help in MySQL

我需要找到表中每個ID表示“是”的最后一行,然后在同一表中搜索該ID的下一個實例,以確保該條目為“否”。 目前,這在與php foreach結合使用的查詢中效果很好,該PHP foreach在第二個查詢的where子句中使用第一個查詢的結果。 數據集僅超過3000行,而整個過程僅需4分鍾多的時間,效率極低。

我知道只有在有一個Where條件的情況下,我才能使用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 />";
        }           
    } ?>

那就是解決您的問題的想法。

select tableNo.*
from
    (SELECT a.memberID, MAX(a.dispatchID) as lastDispatchIDYes
    FROM  members_availability a
    WHERE available = 'Yes'
    GROUP BY memberID) tableYes
    (SELECT a.memberID, a.dispatchID as dispatchIDNo
    FROM  members_availability a
    WHERE available = 'No'
    ) tableNo 
where tableYes.lastDispatchIDYes < tableNo.lastDispatchIDNo AND
      tableYes.memberID = tableNo.memberID

這將獲取available = NO的所有行,並且dispatchID大於可用的最后一行是yes的所有行。

如果我了解您的需求,我認為此查詢可能會有所幫助:

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 />";
}

另外,似乎在問題中提到的代碼示例中的“ echo”語句可能存在問題。 $row->dispatchID在結果集中不是有效值。 我認為應該是$row->lastDispatchIDYes 沒有?

編輯1:更新了查詢,以使“ No”條目可以被其dispatchID大於最后一個帶有“是”的條目的dispatchID的條目使用。 上面的原始查詢僅讀取那些緊接其后的dispatchID的“否”條目。

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`;

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM