update 나눠서 하는 방법

update 나눠서 하는 방법

QA

update 나눠서 하는 방법

본문


<?
include_once('./_common.php');
error_reporting(E_ALL);
ini_set('display_errors', 1);
$tree_data = 0;
function findUser($wr_id)
{
    global $model;
    global $tree_data;
    $childs = [];
    foreach ($model as $key => $val) {
        if ($val['wr_6'] == $wr_id) {
            $tree_data++;
            $childs[] = $val;
        }
    }
    foreach ($childs as $key => $val) {
        if ($val['wr_id'] == 1) {
            $result[] = $val;
        }
        findUser($val['wr_id']);
    }
}
$sql  = "SELECT a.wr_id , a.mb_id , a.wr_6 , a.wr_2 , a.wr_9 , a.wr_10 FROM g5_write_plan_a a";
$my_result = sql_query($sql);
$model = array();
$start = microtime(true);
for ($i = 0; $row = sql_fetch_array($my_result); $i++) {
    $model[] = $row;
}
foreach ($model as $key => $val) {
    //if ($key == 1) {
    $tree_data = 0;
    //echo $val['wr_id'] . "<br>";
    findUser($val['wr_id']);
    $level = '0';
    if ($tree_data < '2') {
        $level = '0';
    }
    if ($tree_data >= '2' and $tree_data <= '5') {
        $level = '1';
    }
    if ($tree_data >= '6' and $tree_data <= '13') {
        $level = '2';
    }
    if ($tree_data >= '14' and $tree_data <= '29') {
        $level = '3';
    }
    if ($tree_data >= '30' and $tree_data <= '61') {
        $level = '4';
    }
    if ($tree_data >= '62' and $tree_data <= '125') {
        $level = '5';
    }
    if ($tree_data >= '126' and $tree_data <= '253') {
        $level = '6';
    }
    if ($tree_data >= '254' and $tree_data <= '509') {
        $level = '7';
    }
    if ($tree_data >= '510' and $tree_data <= '1021') {
        $level = '8';
    }
    if ($tree_data >= '1022' and $tree_data <= '2045') {
        $level = '9';
    }
    if ($tree_data >= '2046' and $tree_data <= '4093') {
        $level = '10';
    }
    if ($tree_data >= '4094' and $tree_data <= '8189') {
        $level = '11';
    }
    if ($tree_data >= '8190' and $tree_data <= '16381') {
        $level = '12';
    }
    if ($tree_data >= '16382' and $tree_data <= '32765') {
        $level = '13';
    }
    if ($tree_data >= '32766' and $tree_data <= '65533') {
        $level = '14';
    }
    if ($tree_data >= '65534' and $tree_data <= '131069') {
        $level = '15';
    }
    if ($tree_data >= '131070' and $tree_data <= '262141') {
        $level = '16';
    }
    if ($tree_data >= '262142' and $tree_data <= '524285') {
        $level = '17';
    }
    if ($tree_data >= '524286' and $tree_data <= '1048573') {
        $level = '18';
    }
    if ($tree_data >= '1048574' and $tree_data <= '2097149') {
        $level = '19';
    }
    if ($tree_data >= '2097150' and $tree_data <= '4194301') {
        $level = '20';
    }
     echo $val['wr_id'] . "<br>";
     echo "tree_data:".$tree_data."<br>";
     echo "level:".$level."<br>";
    $sql = " update g5_write_plan_a set wr_9 = '$level' where wr_id = '$val[wr_id]' ";
    sql_query($sql);
    //}
}
$end = microtime(true);
$time = $end - $start;
echo number_format($time, 8) . "<br>";

 

처음질문내용

https://sir.kr/qa/520248?page=1&unanswered=0&unadopted=0&adopted=0

 

약 7만개가 넘다 보니 sql에 안들어간다고 답변을 주셨습니다. ㅠ

이거 1만개씩 나눠서 하려면 어떻게 하는게 좋을가요? 

ㅠㅠ

이 질문에 댓글 쓰기 :

답변 4

안녕하세요.

다양한 방법이 있겠지만 아래의 코드도 한번 참고를 해보시겠어요~

 

 

<?php
// ... 기존 코드

// 레코드 개수와 현재 페이지
$limit = 10000;
$page = 0;

while (true) {
    $offset = $limit * $page;
    $sql = "SELECT a.wr_id , a.mb_id , a.wr_6 , a.wr_2 , a.wr_9 , a.wr_10 FROM g5_write_plan_a a LIMIT $limit OFFSET $offset";
    $my_result = sql_query($sql);

    // 더 이상 처리할 레코드가 없으면 반복 종료
    if (sql_num_rows($my_result) == 0) {
        break;
    }

    $model = array();
    while ($row = sql_fetch_array($my_result)) {
        $model[] = $row;
    }

    // ... 기존 코드 (레코드 처리)

    // 페이지 증가
    $page++;
}

// ... 기존 코드
?>
 

 

 

 

너무 자세히 넣어 주셔서 감사합니다.
버그 없이 잘 되는데 문제는 1만개만 들어가네요 ㅠ
7만개에 따라 1번 이 15레벨이면 1만개만 들어가다보니 1번이 레벨이 10으로 바뀌네요!
1만개만 인식해서 레벨 뿌려지는거 같아용 ㅠ 1번이라면 7만개 기준으로 레벨이 나와야 되거든요 ㅠ

set_time_limit(0);

일단 이것 부터 시도해보시길.


<?
include_once('./_common.php');
set_time_limit(0); // 추가
error_reporting(E_ALL);
ini_set('display_errors', 1);
$tree_data = 0;
function findUser($wr_id)
{ 이하생략...

php 화일문 안에 sleep() 등을 이용해서 만개마다 잠시 대기를 걸어 두고 돌리거나

 

자바스크립트 setTimeout등으로 업데이트 페이지를 AJax로 불러오는데 그곳에서는 만개씩 불러오게 하는 것도 방법입니다 

만개 끝나면 1초 정도 휴지 시간을 준 다음 다음 만개 불러오고 다 끝나면 1초 쉬고 다음것 만개 불러오고...

 

 

 

답변을 작성하시기 전에 로그인 해주세요.
전체 54
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT