2009-11-02 3 views
0

나는 최근에 꽤 더러운 데이터베이스를 가진 프로젝트를 인수했다 ... 테이블 "사용자"는 "전화"열을 가지고있다 ... 문제는 열이 여러 전화 번호를 "/" ". 나는이 모든 것을 별도의 열 (전화 1, 전화 2, 전화 3 등)에 넣고 싶습니다. 그러나 최선의 방법은 무엇인지 모릅니다. MySQL만으로도 가능합니까? 일종의 PHP 스크립트를 작성해야합니까? 어떤 힌트는 크게 아마 당신의 최선의 방법 인 PHP 스크립트를 작성 ...MySQL을 가진 분할 열

마이크

답변

4

레코드 당 필요한 전화 번호가 확실하지 않은 경우 전화 번호 테이블을 갖고 싶을 수 있습니다. 데이터베이스를 업데이트하는 PHP 스크립트를 실행하는 것이 더 쉬울 수도 있습니다 (전화 번호를 특정 형식으로 위생 처리하지 않고 INNODB를 사용한다고 가정 할 때) :

전화 번호 테이블을 만듭니다. :

CREATE TABLE `user_phone` (
    `userid` int(10) unsigned NOT NULL, 
    `phone` char(15) NOT NULL, 
    PRIMARY KEY (`userid`,`phone`), 
    CONSTRAINT `fk_user_phone_userid` FOREIGN KEY (`userid`) REFERENCES `users` (`userid`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

다음 기존 필드 데이터를 분할하고 새 테이블에 삽입을 만드는 PHP 스크립트를 작성하십시오.

편집 : 내 댓글에 아래에 언급 한 바와 같이 당신이 모든 업데이트 할 수있을 때까지, 당신은 여전히 ​​함께 전화 번호 CONCAT있을 것 뒤쪽하게 호환보기를 할 수 : 나는 확실히을 writting을 끝장

CREATE VIEW `old_table` AS 
    select `u`.*, group_concat(`up`.`phone` separator '/') AS `phone` 
    from `user_phone` `up` 
     left join `users` `u` on(`up`.`userid` = `u`.`userid`) 
    group by `u`.`userid` 
+0

이것은 물론 보고서, GUI 및 기타와 같은 앱의 다른 레이어를 손상시키지 않는다고 가정합니다. – Kuberchaun

+0

물론입니다. 모든 것이 제대로 작동하기 위해 업데이트되기 전까지는 bc에 대한 전화 열을 작성하는보기를 만들 수 있습니다. –

+0

이것은 내가 목표로 한 것입니다 ... 시도해 주셔서 감사합니다;) – mike

5

을 감상 할 수있다.

가능한 전화 번호가 한정되어 있습니까? 그렇다면 새로운 컬럼을 만들 것입니다. 그렇지 않은 경우 사용자 ID가 포함 된 새 전화 번호 테이블을 만들고 그런 식으로 연결합니다.

그 후에 데이터를 쿼리하고 $ phone_array = explode ("/", $ phone_data);

그런 다음 다시 데이터베이스에 삽입하기 시작하십시오.

추가적으로 substring_index 함수를 사용하여 일련의 쿼리를 수행 할 수 있습니다.

+0

이 답변에 대한 핵심 단어는 "유한"이며, 전체적으로 진심으로 동의합니다.그 키워드를 굵게하고자합니다 :) –

+1

전화 번호가 2> 넘었다면 새 테이블을 만들었고, 내 눈에는 phone_1, phone_2 ...을 추가했습니다. phone_n은 phone_1 /.../phone_n만큼 더러운 전화입니다. 특히 사용자 당 전화 번호 수가 일정하지 않은 경우 – phidah

0

을 그 스크립트로.

나는 완전히 새로운 테이블에있는 모든 전화 번호를 퍼팅의 아이디어를 좋아하지만, 확실히, PHONE1과 필드, phone2 등을 두는 것이 수행에 성능이나 구현 문제에 문제가있을 것입니다 경우

어느 솔루션이든지 DB에 액세스하는 방법과 가능한 모든 성능을 확인할 필요가있는 경우 다음과 같이 보일 것입니다. 내가 전화 번호로 저장되는 이상한 조각을 방지하기 위해 자리에 문자열 길이 테스트를

$query = "SELECT id, phone FROM users"; 
$result = $db->query($query); 
while ($row = $result->fetch_assoc()) { 
    $phones = array(); 
    $phones = explode('/', $row['phone']); 
    $i = 1; 
    foreach($phones as $p) { 
    if (strlen($p) >= 7) { 
     $row['phone'.$i] = $p; 
     $i++; 
    } 
    } 
    $upquery = "UPDATE users SET phone1='{$row['phone1}', phone2='{$row['phone2}', ... 
       WHERE id={$row['id'];"; 
    $result = $db->query($query); 
} 

:

아마 같은 끝낼 것입니다. 당신은 또한 그것을 저장하기 전에 각 전화 번호를 예쁜 업 그레 약간의 정규식 마법을 사용할 수 있습니다.

더 빠르게 만드는 방법은 동일한 쿼리에서 여러 업데이트를 실행하는 것입니다. 스크립트가 시간 초과되면 각 실행의 영향을받는 사용자 행 수를 제한하고 여러 번 실행할 수 있습니다.