2012-01-10 5 views
0

これまで数時間かけて遊んできましたが、今まで成功していませんでした。MySQLクエリ内でColdFusion DateDiffを使用していますか?

非常に大きなクエリを出力し、データを処理する前にそれをチャンクに分割しようとしています。このクエリは基本的に毎日実行され、同じデータが1日に1回以上処理されないようにフィールド( 'last_checked')の1つが使用されます。

これは私の既存のクエリです。

<cfquery name="getprice" maxrows="100"> 
    SELECT ID, source, last_checked, price 
    FROM product_prices 
    WHERE source='api' 
    ORDER BY ID ASC 
</cfquery> 

次に、さまざまな更新を行うために結果に対してcfoutputクエリを実行します。このテーブルは現在10万レコードを超えており、1回のヒットですべてを処理するために苦労し始めているため、それを複数の塊に分割する必要があります。

私の意図は、毎回実行するようにcfscheduleすることです(私はmaxrowsを増やし、おそらく15分ごとに実行させます)。しかし、私は過去24時間以内に更新されていない結果しか返さないようにする必要があります。これは私が立ち往生しているところです。

MySQLは独自のDateDiffとTimeDiff関数を持っていることは知っていますが、私はその構文を理解することができないようです - 実際には私の使用に当てはまる場合(ドキュメントはそれに関して矛盾しているようです - 少なくとも私が読んだもので)。

非常に参考になりました!

答えて

1

最初のMySQLでこれを試してみてください:

SELECT ID, source, last_checked, price 
    FROM product_prices 
    WHERE source='api' 
     AND last_checked >= current_timestamp - INTERVAL 24 HOUR 
    ORDER BY ID ASC 
+0

ありがとうエリック、私はあなたが入力したとおりに貼り付けましたが、それは私に構文エラーを与えています。私はINTERVALを前に出会ったことはありません。イベントの作成に関連して見つけることができる唯一の例があるので、どこから始めたらいいですか? – Lee

+2

HOURSではなくHOURに変更してください。 –

+0

@JakeFeasel - ありがとうございます! – Eric

1

私はあなたがあなたのcfqueryでmaxrows=100を使用して警戒でしょう。これにより、データベースからフルレコードセットがCFに返され、最初の100行を除くすべてのレコードがフィルタリングされます。 100,000行のデータセットを扱う場合、これは非常に高価になります。おそらく、過去24時間のフィルタは、基本結果セットのサイズを劇的に縮小するので、おそらくこれは大きな問題ではないでしょう。しかし、過去24時間以内に変更されたものにセットを限定しても、まだ大量のレコードが残っている場合は、これをより効率的に実行する方法を変更することができます。代わりに、検索結果をフィルタリングするためにCFを使用するのでは、MySQLがクエリでLIMITキーワードを使用してそれを行うあります

SELECT ID, source, last_checked, price 
    FROM product_prices 
    WHERE source='api' 
     AND last_checked >= current_timestamp - INTERVAL 1 DAY 
    ORDER BY ID ASC 
LIMIT 0,100 

また、簡単にLIMITの前にオフセット値を加算することにより、100行の「ページ」の間で設定できますLIMIT 300, 100結果セットから行300-400になります。この方法でページングを行うのは、CFにオフロードするよりもはるかに高速です。

+0

ありがとうございますJake、非常に良い点 - 私は本当にLIMITをもっと頻繁に使うべきです! – Lee

関連する問題