2014-09-05 2 views
1

다른 테이블의 검색을 기반으로 SQL 테이블에 두 개의 값을 설정하려고합니다.25,000 개가 넘는 항목으로 테이블 업데이트

UPDATE $postmeta 
SET meta_key = '_bbps_topic_status', 
    meta_value = '1' 
    WHERE post_id IN (
    SELECT ID 
    FROM $posts 
    WHERE post_type='topic' 
    ) 

내가 25,148 행의 전체 테이블에 대해이 작업을 수행 할 수 있지만이 경우에도 서버의 모든 한계를 늘린 후 메모리 오류가 발생합니다 : 내 쿼리는 다음과 같다. 나는 MySQL이 500 개의 그룹으로 작업을 배치하는 것을 허용하지 않는다는 것을 알고 있지만이 작업을 작은 덩어리로 나눌 스크립트를 작성하는 방법은 무엇입니까? 사전에

감사합니다!

편집 :

UPDATE $postmeta 
SET meta_key = '_bbps_topic_status', 
    meta_value = '1' 
    WHERE post_id IN (
    SELECT ID 
    FROM $posts 
    WHERE post_type='topic' 
    AND DATE_SUB(
     CURDATE(), 
     INTERVAL 30 DAY 
     ) <= post_date 
    ) 

답변

2

사용이

UPDATE $postmeta m 
JOIN $posts p ON(p.ID = m.post_id) 
SET m.meta_key = '_bbps_topic_status', 
    m.meta_value = '1' 
WHERE p.post_type='topic' 
AND p.post_date <= NOW() - INTERVAL 30 DAY 

참고가되는 것입니다 하위 쿼리를 사용하는 도움이 될 것입니다 방법 $postmeta 테이블에서 post_id에 인덱스를 조인 쿼리 날짜 범위를 포함 각 행에 대해 대신 실행 조인을 사용하여 쿼리의 성능을 향상시키기 위해 날짜 열에 인덱스를 추가하십시오.

+0

안녕하세요 - 나는 더 복잡한 쿼리를 추가했습니다. 당신이 사용하고있는 JOIN 명령에 그것을 어떻게 포함시키는 지 알아 내지 못했습니다. – RoboRob

+0

@RoboRob이 표현의 결과를 비교하지 않는 동안'DATE_SUB' 부분을 사용하는 목적은 무엇입니까? –

+0

30 일 이상 된 'topic'유형의 모든 게시물을 가져 오려고합니다. SELECT 문에서 실행했을 때, 내가 원했던 것처럼 보였습니다. – RoboRob

관련 문제