2012-02-08 14 views
0

10000以上のレコードのテーブルに定義されたランダムな順序を割り当てようとしています。私は、開始日を利用し、ランダムに割り当てられた連続する各日付に1秒を追加する機能を持っています。それから私はランダムに割り当てられた日付でソートすることができました。私の機能は50レコードで正常に動作しましたが、10000レコードで失敗しました。10000+レコードにランダムな順序を割り当てます。

約9000レコードの正しい日付が設定されますが、1146レコードが割り当てられます0(1969-12-31 19:00:00)これは仕事に似たものを得る助けとなります。

function randomize(){ 
    $count = $this->Application->find('count'); 
    $order = range(0, $count-1); // Array of numbers 0 to count-1 
    $startDate = strtotime('December 13, 2011 0:00:00'); 
    shuffle($order); // scramble array of numbers 
    $Applications = $this->Application->find('all'); 
    set_time_limit(0); 
    foreach($Applications as $app){ 
    $this->Application->id = $app['Application']['id']; 
    $this->Application->saveField('order', date('Y-m-d H:i:s', $startDate + $order[$this->Application->id])); 
    } 
    set_time_limit(30); 
} 

アップデート:私は、MySQLデータベースを使用してますが1つのランダム化のための永久的な状態を必要とし、RAND(BY ORDERごとにランダム化を繰り返しておりません)。オーバーヘッドを減らすためにコードを更新し(上記参照)、php.iniのメモリーを128Mから256Mに増やしました。コード変更では、悪い日付はもはや0ではなく、$ startDateと同じです。これは、$ order配列の配列に問題がある可能性があることを示しています。

+0

レコードを注文するために日時フィールドを使用する理由がわからないのですが。なぜ整数を増やすだけではないのですか? – JJJ

+0

これは、データ所有者が求めたものです。なぜ彼らが望むものなのかわからないが、彼らが望むものだ。 – Naidim

+0

これをさらに最適化するには、 'find'メソッドで' id'を返すだけです。あなたは他のものを使用していないので、それを含むすべての点はありません。 – mrlee

答えて

1

質問:

正しい日付形式を使用していますか?

なぜランダム化する開始日ですか? (この場合はX)固定番号として日付を取ってください:X + givenOrderNumberをレコードごとに実行すると、注文はgivenOrderNumberで定義されます。私はあなたがここに探している理解してクエリを持って

は:

set @num = 0; 
select *, 
    date_add('2011-12-13 00:00:00', interval @num := @num + 1 second) as newOrder 
from table1 
order by newOrder 

Example

これは、1つずつインクリメントされた日付でレコードをソートします。あなたがアプリケーションIDチート使用したい場合は今:...これはあなたのために有用であるかどうか、しかし

select *, 
    date_add('2011-12-13 00:00:00', interval id second) as newOrder 
from table1 
order by newOrder 

Example

を不要であるように思われます。

これが役に立ちます。

+0

はい、日付形式は正しく、10570レコードのうち9324で動作します。 SQLのおかげで、私はそれが必要に応じて動作するように変更することができました。 set @num = 0; UPDATE RAND()によって、 の順番で 'アプリケーション'セット 'order' = date_add( '2011-12-13 00:00:00'、間隔@num:= @num + 1秒) – Naidim

0

私はあなたがそれを行うには奇妙な方法があると思います。使用しているデータベースの種類を教えてください。ランダムMySQLサポートのためのようないくつかのデータベースは、あなたが使用して、また、私はjuhanaコメントに耳を傾けるだろうMySQLで

この

SELECT * FROM tbl_name ORDER BY RAND(); 

のようなものです...ランダムな順序を取得するには、このすべてを行う必要がありません。あなたがレコードのhuuuuugeの量を持っている場合は、整数を使用すると、より簡単に、より良い作業を行うことができます...

まだ私はあなたのデータベースがランダムな順序をサポートする場合は、仕事:D

希望これはあなたを助けます:D

+0

私はMySQLを使用していますが、ランダムな選択は毎回ユニークです。私は記録的な順序の一度の無作為化が必要であり、永久的な状態に設定されているので、それをフィールドに保管しています。 – Naidim

+0

@Naidim:ああ、そうだね。あなたのコードに間違いはありません。しかし、mt_rand()を使ってintを生成し、各日付の時刻としてそのintを使用しようとするかもしれません。データベースのどれが最初のものかを選択する同じ日付のものがあっても、 ) – api55

関連する問題