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

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

最佳答案

你可以用这种方式重写你的查询,纯 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 结构,你可以在内部 while 之前构建其中两个,并根据 is_today 标志填充 id,类似于

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

关于php - 你将如何在没有循环的情况下重写它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6577031/

相关文章:

sql - 会通过保留订购吗?

php - json_decode() 在网络服务器上不工作

php - bind_param 与其他字符连接

javascript - 3秒后重定向至主页

php - 如何在 Laravel 中将外键设置为可为空

sql - 来自多列的where子句

C# SMO 没有脚本约束

php - 我的时间戳有什么问题吗?

Php Login/Mysql 检查 mysql 不适用于 SHA512

sql - 最有用的 SQL 元查询