你如何在没有循环的情况下重写它?

时间:2011-07-05 00:16:22

标签: php mysql sql algorithm optimization

我正在尝试重写这个混乱的代码,因此我只进行一次数据库查询并消除for循环。我希望一个查询而不是两个查询代码会更快。

循环存在的原因有一个:日期属性,即“今天”或“明天”,后跟格式化日期。

这里的要点是我想保持数据结构(dayReport)相同。我想知道结果集属于哪个日期(“今天”或“明天”)。

仅仅因为这个原因而有一个循环似乎很愚蠢。

所以这是代码。它是在PHP中,但实际上这是一个与语言无关的问题:

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

3 个答案:

答案 0 :(得分:0)

如果您的目标是减少Web应用程序与数据库之间的数据交换,请使用存储过程。

答案 1 :(得分:0)

您可以将两个查询合并为UNION或扩展WHERE子句的排名以涵盖这两天。但是,while()循环需要知道如何在没有flag变量的情况下以不同方式处理行。你可以通过让SQL创建一个标志来做到这一点。

答案 2 :(得分:0)

你可以用这种方式重写你的查询,普通的SQL没有php代码

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 for语句并使用is_today标志来区分今天和明天的记录。

对于Day结构,您可以在内部构建之前构建其中两个,并根据is_today标志填充id,类似

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