0

我在页面上运行此查询以使用 foreach 语句显示表中的记录。我认为它导致页面加载缓慢。我在想第二行可能是导致问题的原因。但是,如果我删除该行WHERE code = 'FE',页面会抛出一个 foreach 错误Warning: Invalid argument supplied for foreach()

$arrquery = "SELECT * FROM phpvms_schedules 
WHERE code = 'FE'
AND locate(dayofweek(convert_tz(now(),'+1:00','+0:00'))-1,".TABLE_PREFIX."schedules.daysofweek)>0
AND phpvms_schedules.enabled = '1'
ORDER BY arrtime ASC";

$arrlist = DB::get_results($arrquery);

前锋:

foreach($arrlist as $flight) 
4

4 回答 4

2

您查询的这一行可能会导致您出现问题:

AND locate(dayofweek(convert_tz(now(),'+1:00','+0:00'))-1,".TABLE_PREFIX."schedules.daysofweek)>0

此 WHERE 条件无法利用索引,因此除了在其他 WHERE 条件和条件中使用的列上设置索引之外,您无法优化此查询ORDER BY

好的,根据您的评论,我正在更新我的答案。我认为您最好的选择是使用字符串比较,因此在 PHP 中为您感兴趣的日期构建一个字符串。所以,假设您想要任何包含第 0、2 和 4 天的记录。您将构建一个这样的字符串:

$day_search = '%0%2%4%';

或者,如果您将天数作为数组:

$day_array = array(1,3,5);
$day_search = '%' . implode('%', $day_array) . '%';

然后你会像这样进行搜索:

AND dayofweek LIKE '$day_search'

当然,您需要对 , , 和 conditions 中使用的所有其他列以及所有其他列的索引(尽管GROUP dayofweekBY和 JOIN 在这里不适用)。WHEREORDER BYGROUP BYJOIN

不过老实说,这个表真的应该被规范化,以便在单独的表中显示日期。这样,每条记录都可以在另一个表中为每个适用的日子有一个条目,您可以使用更合适的 WHERE 条件在 JOIN 中进行查询,例如IN()

于 2013-01-30T18:27:03.190 回答
1

不要删除该行WHERE code = 'FE',因为它会使查询失败,只需删除code = 'FE' AND条件,或删除查询中的其余条件

于 2013-01-30T18:27:24.830 回答
0

我建议您在 php 中进行计算,然后将其注入查询

于 2013-01-30T18:33:53.340 回答
0

我相当有信心这将对您有所帮助:

CREATE INDEX idx_code ON phpvms_schedules (code);

但是,在评论中发布EXPLAIN我建议的内容将有助于我们澄清

于 2013-01-30T18:26:48.610 回答