ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Node.js & MySQL] LEFT JOIN으로 가져온 데이터 출력
    생활코딩/WEBn 2020. 12. 9. 21:32

    LEFT JOIN

    SELECT * FROM table1 LEFT JOIN table2 ON table1.key=table2.key

    테이블에 같은 이름의 컬럼이 있는 경우, 테이블.컬럼 형태로 표시해주어야 ambiguity error가 나지 않는다.

    SELECT topic.id, title, author.name, author.description FROM topic LEFT JOIN author ON topic.author_id=author.id;
    
    +----+-----------+--------+-------------+
    | id | title     | name   | description |
    +----+-----------+--------+-------------+
    |  0 | Home      | banana | fruit       |
    |  1 | Google    | banana | fruit       |
    |  2 | Apple     | banana | fruit       |
    |  7 | Amazon    | banana | fruit       |
    |  5 | Microsoft | NULL   | NULL        |
    |  6 | Facebook  | NULL   | NULL        |
    +----+-----------+--------+-------------+
    6 rows in set (0.00 sec)

     

    Node.js에서 MySQL 쿼리문으로 데이터 가져오기

    위 데이터를 Node.js 쿼리문으로 가져오면 이렇다.

    /*
      var db = mysql.createConnection({
        host     : 'localhost',
        user     : 'nodejs',
        password : 'password',
        database : 'data'
      });
      db.connect();
      여기까지 MySQL 연동을 위한 객체 설정 */
    
    db.query('SELECT topic.id, title, author.name, author.description FROM topic LEFT JOIN 
      author ON topic.author_id=author.id', function(err, result){
        callback()
    };

    result에 RowDataPacket이라는 Object 형태로 가져와진다.

    console.log(result); // 위에서 찍어보면
    
    [ RowDataPacket { id: 0, title: 'Home', name: 'banana', description: 'fruit' },
      RowDataPacket { id: 1, title: 'Google', name: 'banana', description: 'fruit' },
      RowDataPacket { id: 2, title: 'Apple', name: 'banana', description: 'fruit' },
      RowDataPacket { id: 7, title: 'Amazon', name: 'banana', description: 'fruit' },
      RowDataPacket { id: 5, title: 'Microsoft', name: null, description: null },
      RowDataPacket { id: 6, title: 'Facebook', name: null, description: null } ]

    WHERE topic.id = 5 등으로 옵션을 주면 특정 행의 데이터만도 가져올 수 있다.

     

    이제 READ 작업시 필요한 부분에 넣어주면 된다.

    db.query('SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.id WHERE topic.id = ', [topicId],
     function(err, result2){   // 구분자가 파일명에서 id로 바뀌면서 title -> topicId
       var template = templates.get(topicId, result2[0], dataList);
                                       // 결과가 result2가 array라서 [0]처럼 인덱싱 필요
        response.writeHead(200);       // 리스폰스쪽은 mysql 쿼리문 전송 이후 살행되는
        response.end(template);        //   callback 함수 안쪽으로 들어갔다
    });

    댓글

Designed by Tistory.