2012-04-12 5 views
0

"프로필"이라는 테이블이 있습니다. 이 테이블에는 "user_id"라는 칼럼이 있는데 이름을 "username"으로 변경하고 INT (11)에서 Varchar (255)로 변경했습니다. 그러나이 열의 내용은 여전히 ​​숫자 ID입니다.다른 테이블과의 관계에 따라 테이블 열을 업데이트하는 방법은 무엇입니까?

이러한 ID는 "users"라고하는 다른 테이블에 해당합니다. 이 테이블에는 "user_id"및 "username"이라는 필드가 있습니다. "profiles"테이블의 각 행에 대해 먼저 사용자 이름 필드에 ID가 있는지 확인하고 사용자 테이블을 조회하여 해당 ID와 일치하는 사용자 이름을 얻은 다음 프로필 테이블의 사용자 이름 값을 업데이트해야합니다 에 대한 적절한 사용자 이름.

프로필 표 :

username | blah blah... 
------------------------ 
1  | ... 

사용자 테이블 :

user_id | username 
------------------------ 
1  | Joe 

나는 "조"로 업데이트 할 수있는 프로파일 테이블에 사용자 이름 필드의 값이 필요합니다.

나는이 PHP 스크립트를 내놓았다하지만 어떤 이유로 단 4 레코드를 업데이트 한 후 작동을 멈 춥니 다 : 그건 그렇게 큰 문제가되지 비록,

$sql = 'SELECT username FROM profiles'; 
    $query = mysql_query($sql); 
    while($row = mysql_fetch_assoc($query)) { 
     $id = $row['username']; 
     $sql = 'SELECT username FROM users WHERE user_id = '. $id; 
     $query = mysql_query($sql); 
     while($row = mysql_fetch_assoc($query)) { 
      $sql = "UPDATE profiles SET username = '".$row['username']."' WHERE username = $id"; 
      $query = mysql_query($sql); 
      if(!$query) { 
       echo 'error!'; 
      } 
     } 
    } 

내 스크립트로 시작하는 모든 것을 효율적이지 않다 테이블에는 단지 50,000 개의 레코드가 있기 때문입니다. 어쨌든 mysql에서 직접이 작업을 수행하는 방법은 무엇입니까?

+0

내 질문에 왜 이렇게하고 싶습니까? 잘 구조화 된 정규화 된 스키마에서 작업하기가 더 어려워서 문제가 발생할 가능성이있는 스키마로 이동하고 있습니다. – liquorvicar

+0

@liquorvicar 그래, 나는하지 않기로 결정했다. 나의 초기 이유는 Bob 대신에 id를 갖는 것보다는 mysite.com/profile?user=Bob과 같은 URL을 사용하여 사용자 이름을 기반으로 사용자를 선택하는 것이 었습니다. 하지만 숫자 ID 대 varchar 콘텐츠를 선택하는 것이 더 빠를 것이라는 사실, ID가 영원히 변경되지 않는다는 사실을 고려하지 않았습니다. 이제는 대신 다음과 같이합니다 : mysite.com/profile?user=Bob&id=123, 그런 식으로 이름과 ID는 둘 다 있지만 ID로 선택하고 미적/유용성 이유로 이름을 지정합니다. – TK123

답변

0

첫 번째 루프에서 $ row 변수를 조작하고 있습니다. 분명히 작동하지 않습니다. 내부 루프의 변수에 다른 이름을 지정해보십시오.

그리고 첫 번째 루프 외부에서 사용하고있는 거의 모든 변수가 내부 루프 내부에서 같은 이름을 사용하고있을뿐만 아니라,

db 스키마도 ID를 사용하여 쿼리하는 것이 varchar 유형의 열보다 빠르기 때문에 사용자 이름이 아닌 외부 키가되도록 id를 선호합니다.

또 하나 개의 제안은 하나 개의 행이 될 것이기 때문에

while($row = mysql_fetch_assoc($query)) 

를 사용할 필요가 없다는 것입니다

0

냅스터는 당신이 당신의 $ 쿼리$ 행을 덮어있어 말했듯 개의 변수. 그러면 즉각적인 문제가 해결됩니다.

또한 while 루프 내부의 쿼리는 while 루프 내에서 절대적으로 끔찍합니다. 어떤 의도도 없다! 우리 모두는 어딘가에서 시작해야합니다. 그러나 나는 당신이 JOIN으로 다시 쓰는 방법을 강하게 조사 할 것입니다. 그래서 당신은 다음 번에 toolbelt에 뭔가를 가지고 있습니다.

희망 하시겠습니까?

0

당신의 테이블 사이의 관계가 잘못되었다고 생각합니다. 사용자 테이블의 user_id에 연결된 프로필 테이블에 외래 키가 있어야합니다. 그런 다음 Joe와 Michael 같은 것을 변경하면 프로필 테이블의 해당 레코드가 업데이트됩니다. .

프로필 표 :

user_id | blah blah... 
------------------------ 
1  | ... 

사용자 테이블 :이가하고 싶은 것이 왜

user_id | username 
------------------------ 
1  | Joe 
0

당신은 하나 개의 쿼리

UPDATE profiles t1 
    INNER JOIN users t2 ON t1.username=t2.user_id 
SET t1.username=t2.username 

을이 작업을 수행 할 수 있습니다 다른 질문.

관련 문제