2012-05-02 2 views
3

여러 테이블을 선택하고 LEFT를 조인하기 위해 mysql 쿼리를 만들려고하지만 모두 '사용자'등의 동일한 열 이름을 갖습니다. 이 방식으로 그래서 mod_backup_accounts . * AS account . *이 할 수있는 방법이있다, 그것은 실패하게 그러나 다음 쿼리동일한 필드 이름을 가진 MYSQL 행을 선택하고 접두사를 추가

SELECT mod_backup_accounts . * AS account . * , mod_backup_subscriptions . * 
FROM `mod_backup_accounts` 
LEFT JOIN `mod_backup_subscriptions` ON `mod_backup_accounts`.subscription_id = `mod_backup_subscriptions`.package_id 

를 시도? 그래서 그것은 계좌의 이름이 될 것입니다.

답변

5

별칭 열에는 약식 열을 제공 할 수 없으므로 각 열 이름에 명시 적으로 지정해야합니다. 어쨌든 일반적으로 SELECT *을 사용하는 대신 SELECT 목록에 명시 적으로 모든 열의 이름을 지정하는 것이 좋습니다. 이는 열 순서를 결정적으로 지정할 수있게하고 이후에 큰 BLOB가 실수로 추가되는 것을 방지하기 때문입니다 (또는 다른 스키마 변경 사항).

SELECT 
    mod_backup_accounts.user AS account_user, 
    mod_backup_subscriptions.user AS subscription_user, 
    ... 
    ... 
FROM 
    mod_backup_accounts 
    LEFT JOIN `mod_backup_subscriptions` ON `mod_backup_accounts`.subscription_id = `mod_backup_subscriptions`.package_id 
+0

다른 방법? 이렇게하려면 많은 SQL이 필요합니다. –

+0

@SauliusAntanavicius 아니요, 구문 상 약식은 없습니다. –

+5

좋은 프로그래머는 타이핑하는 것을 싫어합니다. :) – Ami

0

중복 된 필드 이름에 대한 문제를 완전히 이해합니다.

나는 그것을 해결하기 위해 자신의 함수를 코딩 할 때까지 필요했습니다. PHP를 사용하고 있다면 다음과 같은 기능이있는 경우 사용하고있는 언어로 코드를 사용하거나 코드를 작성할 수 있습니다.

여기에있는 속임수는 mysql_field_table()이 테이블 이름을 반환하고 mysql_field_name()은 결과에있는 각 행의 필드가 mysql_num_fields() 인 경우 새 배열로 혼합 할 수 있기 때문입니다.

"열"만 추가하도록 기능을 수정할 수도 있습니다. 필드 이름이 복제 될 때 접두사.

감사합니다,

function mysql_rows_with_columns($query) { 
    $result = mysql_query($query); 
    if (!$result) return false; // mysql_error() could be used outside 
    $fields = mysql_num_fields($result); 
    $rows = array(); 
    while ($row = mysql_fetch_row($result)) { 
     $newRow = array(); 
     for ($i=0; $i<$fields; $i++) { 
      $table = mysql_field_table($result, $i); 
      $name = mysql_field_name($result, $i); 
      $newRow[$table . "." . $name] = $row[$i]; 
     } 
     $rows[] = $newRow; 
    } 
    mysql_free_result($result); 
    return $rows; 
} 
관련 문제