0

foreach ステートメントを使用してテーブルにレコードを表示するために、ページでこのクエリを実行しています。ページの読み込みが遅くなっていると思います。2行目が問題を引き起こしているのではないかと考えていました。ただし、行を削除すると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) 
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'

もちろん、、、、および条件で使用される他のすべての列と同様に、インデックスが必要です(ただし、dayofweekGROUP BY と JOIN はここでは適用されません)。WHEREORDER BYGROUP BYJOIN

正直なところ、このテーブルは実際には正規化して、別のテーブルに日数を含める必要があります。そうすれば、各レコードは、該当する日ごとに他のテーブルにエントリを持つことができます。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 に答える