2016-08-24 3 views
0
$sql = "SELECT c.id as c_id, w.id as w_id, c.city as cms_city, 
       s.id as state_id, s.state_code as state 
     FROM `cms_hotel` as c 
     join webgeocities as w on c.city=w.name 
        and c.country_code=w.country_code 
     join states as s on (w.state_code= s.state_code) 
     group by c.id"; 
$result = mysqli_query($conn,$sql) or die(mysqli_error()); 
while($row = mysqli_fetch_array($result)){ 

    $upd = "update cms_hotel set city_id = '".$row['w_id']. 
        "' where id = '".$row['c_id']."'"; 
    $upd_result = mysqli_query($conn,$upd) or die(mysqli_error()); 

    $sel = "select id from city_matching where city='".$row['cms_city']. 
        "' and state_id='".$row['state_id']."'"; 
    $sel_result = mysqli_query($conn,$sel) or die(mysqli_error()); 
    if (mysqli_num_rows($sel_result) == 0) { 
     $ins = "insert into city_matching 
       set city_name = '".$row['cms_city']. 
        "' , state_id = '".$row['state_id']."'"; 
     $ins_result = mysqli_query($conn, $ins) or die(mysqli_error()); 
    } 
} 
+0

내가 cms_hotel 테이블에 기록 수백만이 그렇게 내가 원하는 가장 최적화 방법. –

답변

0

코드에서 루프와 SELECT 표현식을 제거하십시오. 실행 다음 쿼리 :

업데이트 :

UPDATE `cms_hotel` as c 
JOIN webgeocities as w ON c.city = w.name 
    AND c.country_code = w.country_code 
JOIN states AS s ON w.state_code = s.state_code 
SET c.city_id = w.id, 
GROUP BY c.id 

삽입 : 쿼리보다 실행

INSERT INTO city_matching (city_name, state_id) 
SELECT c.city, s.id 
FROM `cms_hotel` as c 
JOIN webgeocities as w ON c.city = w.name 
    AND c.country_code = w.country_code 
JOIN states AS s ON w.state_code = s.state_code 
LEFT JOIN city_matching AS cm ON cm.city=c.city 
    AND cm.state_id=s.id 
WHERE cm.city IS NULL 
GROUP BY c.city, s.id 
+0

중복 데이터가 city_matching에 삽입되는 것을 방지하는 방법. 레코드를 업데이트하기 위해 매일 실행해야하므로 city_matching 테이블에서 고유 한 도시를 원합니다. –

+1

삽입 :'LEFT JOIN city_matching AS cm ON cm.city = c.city AND cm.state_id = s.id cm.city가 NULL 인 경우 GROUP BY c.city' – Mike

+0

@Mike와 같은 대답에서 'INSERT'가 편집 됨 – mnv

관련 문제