0

私は現在、レガシーアプリケーションをリファクタリングし、少しずつ zend フレームワーク 1.12 に変換しています。

これを zend db に変換する方法について頭を悩ませていますが、これを 1 つのクエリで実行できる方法はありますか?

今のところ、最初にフォルダーのリストをフェッチしてから、フォルダーごとに追加のクエリを実行していることがわかります...これを1つのクエリとして実行すると、パフォーマンスが向上しますよね?

$folders_query = DB::Query("select * from contacts_folders order by sort_order, name");
while($folders = DB::FetchArray($folders_query)){
    $counts_total = DB::QueryOne("SELECT count(cm.messages_id) AS total
    FROM contacts_basics cb, contacts_messages cm
    WHERE cb.contacts_id = cm.contacts_id
    AND cm.folders_id =  '" . $folders['folders_id'] . "'
    AND cm.status = '1'
    AND cm.mark =  '0'");


    if ($counts_total >0){ 
        $folders_name = '<strong>' . $folders['name'] . ' (' . $counts_total . ')</strong>'; 
    } else { 
        $folders_name = $folders['name']; 
    }

    echo '<li><a href="messages.php?fID=' . $folders['folders_id'] . '">';

    echo $folders_name;

    echo '</a></li>';
}
4

2 に答える 2

2

はい、同じクエリで両方を実行できます

SELECT cf.*, count(cm.messages_id) AS total
FROM contacts_folders cf left outer join
     contacts_messages cm
     on cf.id = cm.folders_id and
        cm.status = '1' AND cm.mark =  '0' left outer join
     contacts_basics cb
     on cb.contacts_id = cm.contacts_id
group by cf.folders_id
order by cf.sort_order, cf.name;

これは、left outer joinメッセージがない場合でも、すべてのフォルダーを確実に取得するために a を使用します (これが元のコードのしくみです)。のため、条件を句left outer joinに移動する必要があります。on

また、フォルダーと合計からすべての情報を取得します。メッセージがない場合は、そのフォルダーに対して 0 を返す必要があります。

于 2013-06-23T17:27:11.723 に答える