생활코딩/WEBn

[Node.js & MySQL] LEFT JOIN으로 가져온 데이터 출력

hayjo 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 함수 안쪽으로 들어갔다
});