복붙노트

PHP & MYSQL : JOIN 연산에서 모호한 열 이름을 찾는 방법은 무엇입니까?

PHP

PHP & MYSQL : JOIN 연산에서 모호한 열 이름을 찾는 방법은 무엇입니까?

데이터베이스에 두 개의 테이블이 있습니다.

뉴스 ( 'id'- 뉴스 ID, 'user'- 작성자의 사용자 ID)

USERS ( 'id'- 사용자 ID)

SELECT * FROM news 사용자가 news.user = user.id에 가입하도록하고 싶습니다. PHP에서 결과를 얻었을 때 다음과 같습니다.

$ row = mysql_fetch_array ($ result), $ row [ 'column-name']에 의해 열 이름을 얻는다. 같은 칼럼 이름을 가진 뉴스 ID와 사용자 ID를 얻는 방법은 무엇인가?

업데이트 : 빠른 답변을 보내 주신 모든 분들께 감사드립니다. 별칭이 최상의 솔루션 인 것처럼 보입니다.

해결법

  1. ==============================

    1.선택할 열에 대해 별칭을 설정할 수 있습니다.

    선택할 열에 대해 별칭을 설정할 수 있습니다.

    $query = 'SELECT news.id AS newsId, user.id AS userId, [OTHER FIELDS HERE] FROM news JOIN users ON news.user = user.id'
    
  2. ==============================

    2.숫자 인덱스 ($ row [0]) 이상을 사용하거나 MySQL에서 AS를 사용할 수 있습니다.

    숫자 인덱스 ($ row [0]) 이상을 사용하거나 MySQL에서 AS를 사용할 수 있습니다.

    SELECT *, user.id AS user_id FROM ...

  3. ==============================

    3.방금 알아 냈어. 그것은 아마 나쁜 습관이지만이 경우에 나를 위해 일했습니다.

    방금 알아 냈어. 그것은 아마 나쁜 습관이지만이 경우에 나를 위해 일했습니다.

    필자는 테이블 접두어로 모든 열 이름을 별칭으로 쓰거나 작성하고 싶지 않은 게으른 사람들 중 하나입니다.

    select 문에서 table_name. *을 사용하여 특정 테이블의 모든 열을 선택할 수 있습니다.

    컬럼 이름이 중복되면 mysql이 처음부터 끝까지 겹쳐 쓸 것이다. 해당 열 이름을 다시 만날 때 첫 번째 중복 된 열 이름의 데이터를 덮어 씁니다. 따라서 마지막에 오는 중복 열 이름이 우선합니다.

    중복 된 열 이름을 포함하는 3 개의 테이블을 조인 할 경우 select 문의 테이블 순서에 따라 중복 열에 대한 데이터가 결정됩니다.

    예:

    SELECT table1.* , table2.* , table3.* FROM table1 LEFT JOIN table2 ON table1.dup = table2.dup LEFT JOIN table3 ON table2.dup = table3.dup;
    

    위의 예제에서 얻을 수있는 dup의 값은 table3에서 가져옵니다.

    dup을 table1의 값으로 지정하려면 어떻게해야합니까?

    그런 다음이 작업을 수행해야합니다.

    SELECT table3.* , table2.* , table1.* FROM table1 LEFT JOIN table2 ON table1.dup = table2.dup LEFT JOIN table3 ON table2.dup = table3.dup;
    

    이제 table1이 마지막으로 오면 dup의 값은 table1의 값이됩니다.

    모든 단일 freaking 컬럼을 작성하지 않고도 dup에 대해 원하는 값을 얻었고 모든 컬럼을 여전히 사용할 수 있습니다. 예!

    나는 dup의 값이 3 개의 테이블 모두에서 동일해야한다는 것을 알고 있지만, table3에 dup에 맞는 값이 없다면 어떻게 될까? 그렇다면 dup은 첫 번째 예에서 공백으로 표시되며 이는 실망 스러울 것입니다.

  4. ==============================

    4.또 다른 팁 : 더 깨끗한 PHP 코드를 원한다면 데이터베이스에 VIEW를 생성 할 수 있습니다.

    또 다른 팁 : 더 깨끗한 PHP 코드를 원한다면 데이터베이스에 VIEW를 생성 할 수 있습니다.

    예 :

    CREATE VIEW view_news AS
    SELECT
      news.id news_id,
      user.id user_id,
      user.name user_name,
      [ OTHER FIELDS ]
    FROM news, users
    WHERE news.user_id = user.id;
    

    PHP의 경우 :

    $sql = "SELECT * FROM view_news";
    
  5. ==============================

    5.너는 뭔가를 할 수있다.

    너는 뭔가를 할 수있다.

    SELECT news.id as news_id, user.id as user_id ....
    

    그리고 나서 $ row [ 'news_id']는 뉴스 id이고 $ row [ 'user_id']는 사용자 ID입니다

  6. ==============================

    6.@ 제이슨. 당신은 php가 범인이고 mysql이 아니라는 점을 제외하면 정확합니다. JOIN을 Mysql Workbench에 넣으면 똑같은 이름 (각 테이블에 하나씩)이 있지만 동일한 데이터가 아닌 3 개의 컬럼을 갖게됩니다 (일부 테이블은 JOIN과 일치하지 않을 경우 null이됩니다).

    @ 제이슨. 당신은 php가 범인이고 mysql이 아니라는 점을 제외하면 정확합니다. JOIN을 Mysql Workbench에 넣으면 똑같은 이름 (각 테이블에 하나씩)이 있지만 동일한 데이터가 아닌 3 개의 컬럼을 갖게됩니다 (일부 테이블은 JOIN과 일치하지 않을 경우 null이됩니다).

    PHP에서는 mysql_fetch_array ()에서 MYSQL_NUM을 사용하면 모든 컬럼을 얻을 수 있습니다. 문제는 MYSQL_ASSOC과 함께 mysql_fetch_array ()를 사용할 때이다. 그런 다음 함수 내부에서 PHP는 다음과 같이 반환 값을 작성합니다.

    $row['dup'] = [value from table1]
    

    나중에 ...

    $row['dup'] = [value from table2]
    

    ...

    $row['dup'] = [value from table3]
    

    따라서 table3의 값만 가져옵니다. 문제는 mysql의 결과 집합이 같은 이름의 열을 포함 할 수 있지만 php의 연관 배열은 배열에 중복 키를 허용하지 않는다는 것입니다. 데이터가 연관 배열에 저장되면 PHP에서 일부 정보가 자동으로 손실됩니다.

  7. ==============================

    7.내가 동적 테이블과 동일한 문제가있었습니다. (테이블에 가입 할 수 있지만 다른 필드에 대해서는 아무런 가정도없는 것으로 가정되는 테이블).이 경우 사용자는 이전에 별칭을 알 수 없습니다.

    내가 동적 테이블과 동일한 문제가있었습니다. (테이블에 가입 할 수 있지만 다른 필드에 대해서는 아무런 가정도없는 것으로 가정되는 테이블).이 경우 사용자는 이전에 별칭을 알 수 없습니다.

    이러한 경우 먼저 모든 동적 테이블에 대한 테이블 열 이름을 가져올 수 있습니다.

    $tblFields = array_keys($zendDbInstance->describeTable($tableName));
    

    여기서 $ zendDbInstance는 Zend_Db의 인스턴스이거나 Zend php pdo에 의존하지 않는 함수 중 하나를 사용할 수 있습니다 : 테이블의 컬럼 이름을 얻습니다.

    그런 다음 모든 동적 테이블에 대해 별칭을 가져올 수 있고 별칭이 필요없는 $ tableName. *을 사용할 수 있습니다.

    $aliases = "";
    foreach($tblKeys as $field)
        $aliases .= $tableName . '.' . $field . ' AS ' . $tableName . '_' . $field . ',' ;
    $aliases = trim(',', $aliases);
    

    이 전체 프로세스를 하나의 포괄적 인 함수로 감쌀 수 있고 더 깨끗한 코드를 갖거나 원하는 경우 더 게으름을 얻을 수 있습니다 :)

  8. ==============================

    8.앨리어스 느낌이 들지 않으면 테이블 이름의 접두사를 붙이기 만하면됩니다.

    앨리어스 느낌이 들지 않으면 테이블 이름의 접두사를 붙이기 만하면됩니다.

    이렇게하면 쿼리 생성을보다 효율적으로 자동화 할 수 있습니다. 또한 select *를 사용하지 않는 것이 가장 좋습니다 (필요한 필드를 선택하는 것보다 분명히 느립니다). 또한 원하는 필드의 이름을 명시 적으로 지정하십시오.

    SELECT
        news.id, news.title, news.author, news.posted, 
        users.id, users.name, users.registered 
    FROM 
        news 
    LEFT JOIN 
        users 
    ON 
        news.user = user.id
    
  9. ==============================

    9.두 가지 접근 방식이 있습니다.

    두 가지 접근 방식이 있습니다.

    1. 별칭 사용하기. 이 방법에서는 다양한 컬럼에 새로운 고유 이름 (ALIAS)을 부여한 다음 PHP 검색에 사용합니다.

    예.

    SQL $ sql = SELECT student_id FEES_LINK, students_fee CLASS_LINK에서 students_fee_tbl LEFT JOIN student_class_tbl ON students_fee_tbl.student_id = student_class_tbl.student_id

    PHP $ query = mysql_fetch_assoc ($ sql); // 이전 접근법을 사용하는 경우

    $ query = PDO-> fetchAll (); // 정확한 구문은 아니지만 이것이 현재 접근법입니다.

    foreach($query as $q){
    echo $q['FEES_LINK'];
    }
    

    2.

    장소 위치 또는 결과 집합 열 인덱스 사용; 이 경우 배열 위치는 중복 된 열 이름을 참조하는 데 사용됩니다. 서로 다른 위치에 나타나기 때문에 사용되는 색인 번호는 항상 고유합니다. 그러나 인덱스 위치 지정 번호는 0에서 시작합니다.

    예.

    $ sql = 선택 student_id, students_fee_tbl의 student_class LEFT JOIN student_class_tbl ON students_fee_tbl.student_id = student_class_tbl.student_id

    PHP

    $ query = mysql_fetch_assoc ($ sql); // 이전 접근법을 사용하는 경우

    $ query = PDO-> fetchAll (); // 정확한 구문은 아니지만 이것이 현재 접근법입니다

    foreach($query as $q){
    
        echo $q[0];
    
    }
    

    두 작품.

    희망이 도움이됩니다. :)

  10. from https://stackoverflow.com/questions/431391/php-mysql-how-to-resolve-ambiguous-column-names-in-join-operation by cc-by-sa and MIT license