2012-02-08 7 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에 의해 주문에 따라 무작위 반복하지(). 오버 헤드를 줄이기 위해 위의 코드를 업데이트했고, php.ini의 메모리를 128M에서 256M으로 늘렸다. 코드 변경으로 잘못된 날짜는 더 이상 0이 아니지만 $ orderDate와 같아서 $ order 배열의 배열에 문제가 될 수 있음을 나타냅니다.

+0

레코드를 정렬하는 데 datetime 필드를 사용하려는 이유가 확실하지 않습니다. 왜 단순히 증가하는 정수를 사용하지 않는가? – 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

그것은 하나마다에 의해 증가 된 날짜를 기준으로 레코드를 정렬합니다. 응용 프로그램 아이디 치트 사용하려는 경우 지금이 유용 여부, 그러나

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

Example

을 여부를 당신을 위해 ... 불필요한 것 같다.

희망이 도움이됩니다.

+0

예, 날짜 형식이 올바르며 10570 레코드 중 9324에서 작동합니다. SQL을 주셔서 감사 드리며, 필요에 따라 작동하도록 수정할 수있었습니다. @num = 0; UPDATE'응용 프로그램''주문'= date_add ('2011-12-13 00:00:00', 간격 @num : = @ num + 1 초) RAND()에 의한 주문 – Naidim

0

나는 그것을하기에 이상한 방법이 있다고 생각합니다. 사용중인 데이터베이스 유형을 알려주시겠습니까? 임의 MySQL을 지원하기 위해 같은 일부 데이터베이스는, 그래서 당신은 사용, 또한 내가 juhana의 의견을들을 것입니다 MySQL은

SELECT * FROM tbl_name ORDER BY RAND(); 

처럼 ... 임의의 순서를 얻기 위해 모든이 작업을 수행 할 필요가 없습니다 정수가 날짜보다 쉽고 잘 수행되면 biguint를 사용할 수 있습니다 ...

데이터베이스가 무작위 순서를 지원하므로 더 적은 작업을 수행 할 수 있는지 먼저 확인하려고합니다. 직장 : D

희망이 당신을 도울 수 : D 조

+0

MySQL을 사용하는 동안 무작위 선택은 매번 고유합니다. 나는 기록적인 순서의 일회성 무작위 화가 필요하며 영구적 인 상태로 설정된다. 그래서 나는 그것을 필드에 저장하고있다. – Naidim

+0

@Naidim : 오, 알겠습니다. 나는 당신의 코드에 실수를 보지 못했다. 그러나 mt_rand()를 사용하여 int를 생성하고 각 날짜의 시간으로 해당 int를 사용하려고 시도 할 수 있습니다. 두 날짜가 데이터베이스에서 어느 날짜가 첫 번째 날짜와 동일한 날짜가 있어도 임의의 순서를 지정합니다.) – api55