我在页面上运行此查询以使用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:
foreach($arrlist as $flight)
答案 0 :(得分: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'
当然,您需要dayofweek
上的索引以及WHERE
,ORDER BY
,GROUP BY
和JOIN
条件中使用的所有其他列(尽管GROUP BY和JOIN不适用于此处。)
老实说,这个表确实应该被标准化,以便将日期放在一个单独的表中。这样,每个记录在每个适用的日期都可以在另一个表中有一个条目,您可以使用更合适的WHERE条件(例如IN()
答案 1 :(得分:1)
请勿删除第WHERE code = 'FE'
行,因为它会使查询失败,只需删除code = 'FE' AND
条件,或删除查询中的其余条件
答案 2 :(得分:0)
我相信这会对你有所帮助:
CREATE INDEX idx_code ON phpvms_schedules (code);
但是,我在评论中建议发布EXPLAIN
,这有助于我们澄清
答案 3 :(得分:0)
我建议您在php中进行计算,然后将其注入查询