복붙노트

[SQL] 결과를 검색 할 때 어떻게 모호한 열 이름을 해결하기 위해?

SQL

결과를 검색 할 때 어떻게 모호한 열 이름을 해결하기 위해?

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

열 NEWS 테이블 :

열 USERS 테이블 :

나는이 SQL을 실행하려면 :

SELECT * FROM news JOIN users ON news.user = user.id 

내가 도착하면 PHP I의 결과는 연관 배열을 얻을 $ 행 [ '열 이름']에 의해 열 이름을 좀하고 싶습니다. 어떻게 같은 열 이름을 가진, 뉴스 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.당신이 중 하나는 MySQL에서와 같이,보다 효율적으로 사용하는 숫자 인덱스를 사용 ($ 행 [0]) 또는 수 있습니다 :

    당신이 중 하나는 MySQL에서와 같이,보다 효율적으로 사용하는 숫자 인덱스를 사용 ($ 행 [0]) 또는 수 있습니다 :

    SELECT *는 AS가 FROM USER_ID user.id ...

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

    3.난 그냥이 아웃 생각. 아마 나쁜 습관이다하지만이 경우에 나를 위해 일했다.

    난 그냥이 아웃 생각. 아마 나쁜 습관이다하지만이 경우에 나를 위해 일했다.

    나는 별명을 원하거나 테이블 접두사로 모든 ​​열 이름을 기록하지 않는 게으른 사람 중 하나입니다.

    당신은 TABLE_NAME을 사용하여 특정 테이블에서 모든 열을 선택할 수 있습니다. * 당신의 선택 성명에서.

    당신이 중복 된 열 이름이있을 때, MySQL은 처음부터 마지막까지 덮어 쓰게됩니다. 다시 그 열 이름을 만나면 제 중복 열 이름의 데이터를 덮어 쓰게된다. 마지막 승리에서 오는 중복 된 열 이름 그래서.

    내가 3 개 테이블을 조인하고있는 경우, 중복 된 열 이름을 포함하는 각각 선택 문에서 테이블의 순서는 내가 중복 된 컬럼에 대해 무엇입니까 데이터를 결정합니다.

    예:

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

    위의 예에서, 내가 할 DUP의 값은 표 3에서 일 것이다.

    나는 표에서 값을 무엇 DUP하려면?

    그리고 나는이 작업을 수행해야합니다

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

    DUP의 값이 표에서 값을 가져옵니다 그래서 지금, 표는 지난 온다.

    나는 모든 단일 괴물 열을 작성할 필요하고 나는 아직도 작업은 모든 열을 얻을하지 않고 내가 DUP 수배 값을 얻었다. 야호!

    나는 DUP의 값이 3 개 테이블에서 동일해야합니다 알고 있지만, 무엇 표 3은 DUP에 일치하는 값이없는 경우? 그런 다음 DUP 첫 번째 예제에서 빈 것, 그것은 안됐다 될 것이다.

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

    4.또 다른 팁 : 당신이 청소기 PHP 코드를 갖고 싶어, 당신은 예를 들어, 데이터베이스에보기를 만들 수 있습니다

    또 다른 팁 : 당신이 청소기 PHP 코드를 갖고 싶어, 당신은 예를 들어, 데이터베이스에보기를 만들 수 있습니다

    예를 들면 :

    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 ....
    

    그리고 [ 'news_id'] $ 행은 뉴스 ID와 사용자 ID 될 것 $ 행 [ 'user_id를'] 될 것입니다

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

    6.@ 제이슨. 그 PHP가 범인이 아닌 MySQL은이다를 제외하고 당신은 정확합니다. 당신은 MySQL의 워크 벤치에 가입하여 넣을 경우 동일한 이름 (각 테이블 당 하나)하지만 동일한 데이터와 세 개의 열을 얻을 것이다 (조인에 대한 해당 테이블이 일치가없는 경우 일부는 null가됩니다).

    @ 제이슨. 그 PHP가 범인이 아닌 MySQL은이다를 제외하고 당신은 정확합니다. 당신은 MySQL의 워크 벤치에 가입하여 넣을 경우 동일한 이름 (각 테이블 당 하나)하지만 동일한 데이터와 세 개의 열을 얻을 것이다 (조인에 대한 해당 테이블이 일치가없는 경우 일부는 null가됩니다).

    PHP에서는 MYSQL_NUM에로 MYSQL_ASSOC () 다음 모든 열을 얻을 것이다 사용하는 경우. 당신이 MYSQL_ASSOC와 ()로 MYSQL_ASSOC를 사용할 때 문제입니다. 그런 다음, 그 함수 내에서, PHP는 그래서 같은 반환 값을 구축하는 것입니다 :

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

    나중에 ...

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

    ...

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

    그래서 당신은 표 3 만 값을 얻을 것이다. 문제는 MySQL의에서 결과 세트는 배열에서 중복 키를 허용하지 않는 이름은 같지만 PHP의 연관 배열로 열을 포함 할 수 있다는 것입니다. 데이터가 연관 배열에 저장하면, PHP, 일부 정보는 자동으로 손실됩니다 ...

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

    7.나는 동적 테이블이 같은 문제가 있었다. (ID를 가지고 가정 테이블 조인하지만 나머지 필드에 대한 가정없이 할 수 있어야합니다.)이 경우 손 전에 별칭을 모른다.

    나는 동적 테이블이 같은 문제가 있었다. (ID를 가지고 가정 테이블 조인하지만 나머지 필드에 대한 가정없이 할 수 있어야합니다.)이 경우 손 전에 별칭을 모른다.

    이러한 경우 먼저 모든 동적 테이블에 대한 테이블 열 이름을 얻을 수 있습니다 :

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

    $ 젠드 DB 인스턴스는 젠드 DB의 인스턴스 또는 당신은 젠드의 PHP PDO에 의존하지 여기 기능 중 하나를 사용할 수 있습니다 : 테이블의 열 이름을 가져

    그런 다음 모든 동적 테이블에 대한 당신은 별칭을 얻을 $ TABLENAME을 사용할 수 있습니다 * 당신은 필요가 없습니다 별칭을 할 사람을 위해. :

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

    당신은 하나 개의 일반적인 기능으로이 모든 과정을 마무리 그냥 청소기 코드를하거나 원하는 경우 더 게으른 얻을 수 있습니다 :

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

    8.당신은 또한 단지 테이블 이름을 접두사 할 수 있습니다 별명처럼 생각하지 마십시오.

    당신은 또한 단지 테이블 이름을 접두사 할 수 있습니다 별명처럼 생각하지 마십시오.

    이 방법 당신은 당신의 쿼리의 자동화 세대를 더 나은 수 있습니다. 또한,이 선택 *를 사용하지 않는 것이 최선의 방법이야 (그것은 단지 당신이 필요로하는 분야를 선택하는 것보다 분명히 느린 또한, 명시 적으로 당신이 할 필드 이름을 지정합니다.

    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.다음은 JSON 결과가 반환되는 작동도 모두 간단하고 위의 답변은입니다. SQL 쿼리는 웹 페이지로 다시 보낼 수있는 결과를 JSON 인코딩, 중복 된 이름으로 해당 필드의 값을 사용자가 SELECT *를 사용하는 동일한 필드 이름의 각 인스턴스를 자동으로 접두사 테이블 이름을 무시하고 대신 NULL 값을 반환되지만 .

    다음은 JSON 결과가 반환되는 작동도 모두 간단하고 위의 답변은입니다. SQL 쿼리는 웹 페이지로 다시 보낼 수있는 결과를 JSON 인코딩, 중복 된 이름으로 해당 필드의 값을 사용자가 SELECT *를 사용하는 동일한 필드 이름의 각 인스턴스를 자동으로 접두사 테이블 이름을 무시하고 대신 NULL 값을 반환되지만 .

    정확히 무엇을하는 일은 중복 된 필드 이름의 첫 번째 인스턴스를 포함하지만, 그 값에 NULL을합니다. 그리고 필드 이름의 두 번째 인스턴스 (다른 테이블) 전체 필드 명과 값을 모두 생략한다. (예 : Navicat는 사용 등) 데이터베이스에 직접 쿼리를 테스트 할 때, 모든 필드는 결과 집합에 반환됩니다. 그것은 단지의 옆 JSON 그 결과의 인코딩 할 때, 그들은 완전히 생략 NULL 값과 이후의 중복 된 이름을 가지고 않습니다.

    그래서, 문제를 해결하는 쉬운 방법은 먼저하는 SELECT *를 수행 중복에 대한 별칭 필드 따르는 것입니다. 여기에 두 테이블이 동일 _ 이름 필드라는 이름의 한 예, 있습니다.

    SELECT *, w.site_name AS wo_site_name FROM ws_work_orders w JOIN ws_inspections i WHERE w.hma_num NOT IN(SELECT hma_number FROM ws_inspections) ORDER BY CAST(w.hma_num AS UNSIGNED);
    

    이제 디코딩 된 JSON에서, 당신은 필드 wo_site_name를 사용할 수 있으며 값이 있습니다. 이 경우, 사이트 이름은 따옴표와 작은 따옴표, 따라서 원래 절약 인코딩, 데이터베이스에서 결과를 사용하여 디코딩과 같은 특수 문자가 있습니다.

    ...decHTMLifEnc(decodeURIComponent( jsArrInspections[x]["wo_site_name"]))
    

    당신은 항상 SELECT 문에서 처음 *를 붙이해야하지만, 반복적으로 열을 선택로하는 것은 아무런 문제가 발생하지 않습니다, 원하는 그 후 많은 이름과 별명 열로 포함 할 수 있습니다.

  10. ==============================

    10.데이터베이스 interacttion에 대한 PDO를 사용하는 경우, 하나는 PDO를 사용할 수 있습니다 :: FETCH_NAMED 문제를 해결하는 데 도움이 될 수 모드를 가져 오기 :

    데이터베이스 interacttion에 대한 PDO를 사용하는 경우, 하나는 PDO를 사용할 수 있습니다 :: FETCH_NAMED 문제를 해결하는 데 도움이 될 수 모드를 가져 오기 :

    $sql = "SELECT * FROM news JOIN users ON news.user = user.id";
    $data = $pdo->query($sql)->fetchAll(PDO::FETCH_NAMED);
    foreach ($data as $row) {
        echo $row['column-name'][0]; // from the news table
        echo $row['column-name'][1]; // from the users table
        echo $row['other-column']; // any unique column name
    }
    
  11. ==============================

    11.두 가지 방법이 있습니다 :

    두 가지 방법이 있습니다 :

  12. from https://stackoverflow.com/questions/431391/how-to-resolve-ambiguous-column-names-when-retrieving-results by cc-by-sa and MIT license