我正在尝试重写这段乱七八糟的代码,以便只进行一次数据库查询并消除 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/