MariaDB를 사용하여 특정 게시글을 조회할 때, 이전 글과 다음 글의 정보를 함께 가져오는 작업을 수행하려면 SQL 쿼리를 적절히 작성해야 합니다. 다만, 다양한 함수를 사용한 포스팅들은 많지만 기본 함수로 이루어져 있는 글을 보지 못해 이번 포스팅에서는 이러한 기능을 구현하는 SQL 쿼리를 기본 함수로 작성하고 Join으로 처리해 최적화하는 방법을 다룹니다.
기본 쿼리 설명
아래는 기본 함수와 Join으로 이루어져 최적화된 SQL 쿼리입니다. 이 쿼리는 현재 글의 정보를 가져오고, 이전 글 및 다음 글의 정보를 함께 조회하여, 이전 글과 다음 글의 제목을 포함한 정보를 반환합니다.
SELECT
current_row.*,
IFNULL(previous_row.`index`, 0) AS `prev`,
IFNULL(next_row.`index`, 0) AS `next`,
IFNULL(previous_row.`title`, '이전 글이 없습니다.') AS `prevTitle`,
IFNULL(next_row.`title`, '다음 글이 없습니다.') AS `nextTitle`
FROM
(SELECT `index`,
`category_id`,
`user_email`,
`created_at`,
`title`,
`content`,
`view_count`
FROM `qna`.`qna_articles`
WHERE `index` = #{index}
AND `category_id` = #{categoryId}) AS current_row
LEFT JOIN
(SELECT `index`, `title`
FROM `qna`.`qna_articles`
WHERE `index` < #{index}
AND `category_id` = #{categoryId}
ORDER BY `index` DESC
LIMIT 1) AS previous_row ON 1 = 1
LEFT JOIN
(SELECT `index`, `title`
FROM `qna`.`qna_articles`
WHERE `index` > #{index}
AND `category_id` = #{categoryId}
ORDER BY `index` ASC
LIMIT 1) AS next_row ON 1 = 1
ORDER BY
current_row.`index` DESC;
쿼리의 각 부분 설명
1. 현재 글 정보 조회
(SELECT `index`,
`category_id`,
`user_email`,
`created_at`,
`title`,
`content`,
`view_count`
FROM `qna`.`qna_articles`
WHERE `index` = #{index}
AND `category_id` = #{categoryId}) AS current_row
이 부분은 주어진 index와 category_id에 해당하는 현재 글의 정보를 조회합니다. 결과는 current_row라는 별칭을 사용하여 참조됩니다.
2. 이전 글 정보 조회
LEFT JOIN
(SELECT `index`, `title`
FROM `qna`.`qna_articles`
WHERE `index` < #{index}
AND `category_id` = #{categoryId}
ORDER BY `index` DESC
LIMIT 1) AS previous_row ON 1 = 1
이 서브쿼리는 현재 글의 index보다 작은 글들 중에서 가장 최근의 글(즉, 가장 큰 index)을 조회합니다. LEFT JOIN을 사용하여 이전 글의 정보를 현재 글과 조인합니다. 이전 글이 없을 경우를 대비하여 IFNULL을 사용하여 기본 값을 설정합니다.
3. 다음 글 정보 조회
LEFT JOIN
(SELECT `index`, `title`
FROM `qna`.`qna_articles`
WHERE `index` > #{index}
AND `category_id` = #{categoryId}
ORDER BY `index` ASC
LIMIT 1) AS next_row ON 1 = 1
이 서브쿼리는 현재 글의 index보다 큰 글들 중에서 가장 이전의 글(즉, 가장 작은 index)을 조회합니다. LEFT JOIN을 사용하여 다음 글의 정보를 현재 글과 조인합니다. 다음 글이 없을 경우를 대비하여 IFNULL을 사용하여 기본 값을 설정합니다.
4. 이전 글 및 다음 글 정보 조인
LEFT JOIN
(SELECT `index`, `title`
FROM `qna`.`qna_articles`
WHERE `index` < #{index}
AND `category_id` = #{categoryId}
ORDER BY `index` DESC
LIMIT 1) AS previous_row ON 1 = 1
LEFT JOIN
(SELECT `index`, `title`
FROM `qna`.`qna_articles`
WHERE `index` > #{index}
AND `category_id` = #{categoryId}
ORDER BY `index` ASC
LIMIT 1) AS next_row ON 1 = 1
이 두 부분은 이전 글과 다음 글의 제목을 각각 조회하여, 현재 글과 조인합니다. IFNULL을 사용하여 이전 글이나 다음 글이 없는 경우 기본 값을 설정합니다.
결론
위 쿼리는 현재 게시글의 정보를 조회할 뿐만 아니라, 이전 글과 다음 글의 정보를 함께 가져와 사용자에게 편리한 네비게이션을 제공합니다. MariaDB에서 이러한 쿼리를 사용하면 블로그나 Q&A 시스템에서 보다 나은 사용자 경험을 제공할 수 있습니다. 쿼리 최적화를 통해 성능을 향상시키고, 가독성을 높이며, 유지보수하기 쉽게 만들 수 있습니다. 이를 통해 더욱 효율적인 데이터베이스 관리가 가능합니다.
'MySQL' 카테고리의 다른 글
댓글에 답글 기능을 추가하는 방법: 데이터베이스 설계 (0) | 2024.07.05 |
---|---|
댓글에 좋아요 기능을 추가하는 방법: 데이터베이스 설계 (1) | 2024.06.21 |