我正在尝试重写这个混乱的代码,因此我只进行一次数据库查询并消除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;
}
}
答案 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;
}
}