SQL 테이블 내부에 1:N 관계인 데이터를 JSON 형태로 출력하는법.
먼저 for문을 사용해도 Object 형태로 추출이 가능하다. PR 피드백으로 for문 말고 쿼리문으로 해결이 가능해보인다며.. 멘토님이 참고하라며 주신 MsSQL 링크...(아니 우린 MySQL 인데,,) 적용 불가능한건데 그걸 제대로 안 살피고 안된다고 넋놓고 있었다..
하여튼 내가 원하는 결과 값의 형태는 1명의 유저가 여러 게시글을 작성한 경우 유저 id, name은 1번만 출력되고 게시글 정보 posting에 묶여서 출력되게 하는게 목표였다.
일단 MsSQL의 JSON PATH, AUTO 이런건 MySQL에 절대 적용이 안되니 혹시 저처럼 제대로 안살피고 무작정 따라 치시는 분이 있으시면 당장 멈추시길..ㅠㅠ
테이블의 기본정보는 다음과 같이 posts, users 두가지로 설정하였다.
서브쿼리를 사용하긴 했는데 JSON_ARRAYAGG 와 JSON_OBJECT를 사용해서 posting 데이터를 Object 형태로 가져왔다.
post 컬럼에 게시글에대한 정보가 Object 형태로 들어갔다.
이걸 이대로 res로 보내면
post가Key, Value 형태고 pots의 Value가 String 형태로 출력된다. 그래서 post의 post만 다른 변수에 저장하여 JSON.parse()를 이용하여 Object 형태로 바꿔주고, Key, Value를 입력해서 원하는 형태로 결과값을 반환해주는 방법을 선택하였다.
코드도 첨부하였다.
app.get('/posts/:id', async (req, res) => {
const { id } = req.params;
await myDataSource.query(
`
SELECT users.id as id, users.no as no,
((SELECT JSON_ARRAYAGG(
JSON_OBJECT('no', no, 'title', title, 'post', post ))
FROM posts WHERE posts.user_id=${ id }))
AS post FROM users
WHERE users.no=${ id }
`, (err, rows) => {
let post = rows[0].post
let postObj = JSON.parse(post)
res.status(200).json( { user_name : rows[0].id, user_no : rows[0].no , posting : postObj} )
}
)
});
참고자료
1. SQL 테이블에서 Object 형태로 값 뽑아내기
2. String을 Object 형태로 변환하기
'개인공부 기록 > node.js' 카테고리의 다른 글
1차 프로젝트 회고록 (0) | 2022.08.27 |
---|---|
1차 프로젝트 중간회고 (0) | 2022.08.21 |
[ERROR] Mysql No Database Selected 해결하기 (0) | 2022.08.11 |
[Error] TypeError: Cannot convert undefined or null to object 해결하기(Feat. 게시글 업데이트) (0) | 2022.08.10 |
[Git] Push 오류 (리모트에 로컬에 없는 사항이 들어있으므로 업데이트가 거부되었습니다.) (0) | 2022.08.05 |