2011-07-05 8 views
2

私はこの乱雑なコードを書き直そうとしているので、1つのデータベースクエリを作成してforループを削除するだけです。私はコードが2つではなく1つのクエリで高速になることを期待しています。ループなしでこれをどのように書き直しますか?

ループは1つの理由で存在します。日付属性は、 "Today"または "Tomorrow"の後に書式設定された日付のいずれかです。

メインポイントここでは、データ構造(dayReport)を同じにしたいと考えています。結果セットがどの日付に属するかを知りたい(「今日」または「明日」のいずれか)。

その理由だけではループが愚かなようです。

ここにコードがあります。これは、PHPでだが、本当にこれは言語に依存しない質問です:あなたの目標は、Webアプリケーションとデータベース間のデータのやり取りを軽減する場合

for ($a=1; $a<=2; $a++) 
{ 
    $b = $a - 1; 
    $result = mysql_query("SELECT 
          name, 
          time, 
          date_format(time,'%M %d %Y %h:%i %p') as ftime, 
          date_format(time,'%l:%i %p') as ttime, 
          fee 
          FROM `foo_bar` 
          WHERE `cityId` = $cityId 
          AND time_utc > utc_timestamp() 
          AND time >= DATE_ADD(curdate(),INTERVAL $b day) 
          AND time < DATE_ADD(curdate(),INTERVAL $a day) 
          ORDER BY time ASC 
          ") or die(mysql_error()); 


    if ($result && mysql_num_rows($result) > 0) 
    { 
    $day = new Day(); 
    $day->date = $a == 1 ? 'Today' . date(' - l, F d') : 'Tomorrow' . date(' - l, F d',strtotime('+'.$b.' day')); 
    $dayStuff = array(); 
    while ($row = mysql_fetch_object($result)) 
    { 
     $dayStuff[] = $row; 
    } 
    $day->foo = $dayStuff; 
    $dayReport[] = $day; 
    } 
} 
+0

のようなもの。ループは私にとっては大丈夫です。 – alex

答えて

0

あなたは、あなたが完全に文の外にPHPを削除し、今日と明日、レコードを区別するis_todayフラグを使用することができ

SELECT 
    name, time, 
    date_format(time,'%M %d %Y %h:%i %p') as ftime, 
    date_format(time,'%l:%i %p') as ttime, 
    fee, 
    `time` = CURDATE() AS is_today -- Note this flag 
    FROM `foo_bar` 
    WHERE `cityId` = $cityId 
    AND time_utc > utc_timestamp() 
    AND time BETWEEN CURDATE() AND DATE_ADD(CURDATE(),INTERVAL 1 day) -- rewritten clause for clarity 
    ORDER BY time ASC 

何のPHPコード、このように、プレーンSQLをクエリを書き直すことができませんでした。あなたが望んだ二度あれば `)(` mysql_fetch_objectを呼び出すことができますが、内側しばらく前に、それらのうちの2つを構築し、is_todayフラグに応じてIDを埋めることができるものデイ構造についてについては

while ($row = mysql_fetch_object($result)) 
{ 
    if ($row['is_today']) { 
     $todayStuff[] = $row; 
    } else { 
     $tomorrowStuff[] = $row; 
    } 
} 
+0

私もこれについて考えていましたが、あなたはそれをコードに入れました。ありがとう – sqlman

0

使用ストアドプロシージャ。

0

UNIONに2つのクエリを組み合わせるか、両方の日をカバーするようにWHERE句のランクを拡張することができます。しかし、while()ループは、フラグ変数なしで行を別々に処理する方法を知る必要があります。あなたはフラグを作成するSQLを取得することによってそれを行うことができます。

関連する問題