728x90
쿼리문에서 되도록 group by 를 안쓰는 구조로 테이블구조를 잡는것이 좋지만 의외로 group by 를 해야 하는 경우가 꽤 많이 발생한다. 이때 그룹핑을 했을때 페이징 관련 처리 방법을 php 코드를 예시로 아래와 같이 정리해 본다.
group by 예시 쿼리문
SELECT column1, COUNT(*)
FROM your_table
GROUP BY column1
ORDER BY COUNT(*) DESC
LIMIT 10;
group by 로 php 코드에서 페이징 처리 예시
<?php
// 데이터베이스 연결 설정
$host = 'localhost';
$dbname = 'your_database';
$username = 'your_username';
$password = 'your_password';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
// 페이지 번호와 페이지당 항목 수 설정
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1; // 현재 페이지
$limit = 10; // 페이지당 항목 수
$offset = ($page - 1) * $limit; // OFFSET 계산
// 총 게시물 수를 가져오기
$totalQuery = $pdo->query("SELECT COUNT(*) FROM board");
$totalRows = $totalQuery->fetchColumn();
$totalPages = ceil($totalRows / $limit); // 총 페이지 수
// 데이터 가져오기
$query = $pdo->prepare("SELECT * FROM board ORDER BY created_at DESC LIMIT :offset, :limit");
$query->bindParam(':offset', $offset, PDO::PARAM_INT);
$query->bindParam(':limit', $limit, PDO::PARAM_INT);
$query->execute();
$posts = $query->fetchAll(PDO::FETCH_ASSOC);
// 결과 출력
foreach ($posts as $post) {
echo "<h2>" . htmlspecialchars($post['title']) . "</h2>";
echo "<p>" . htmlspecialchars($post['content']) . "</p>";
}
// 페이지 네비게이션
echo '<div class="pagination">';
if ($page > 1) {
echo '<a href="?page=' . ($page - 1) . '">이전</a>';
}
for ($i = 1; $i <= $totalPages; $i++) {
if ($i == $page) {
echo '<strong>' . $i . '</strong>'; // 현재 페이지 표시
} else {
echo '<a href="?page=' . $i . '">' . $i . '</a>';
}
}
if ($page < $totalPages) {
echo '<a href="?page=' . ($page + 1) . '">다음</a>';
}
echo '</div>';
?>
728x90
'MYSQL' 카테고리의 다른 글
지역 테이블 수정 쿼리문 case 구문 예시 (0) | 2025.01.22 |
---|---|
쿼리문에서 필드 합쳐서 가져오기 CONCAT (1) | 2024.11.20 |
insert 후 자동 증가 키 값 가져오기 (0) | 2024.11.19 |
sql 그룹별 평균 구하기 (0) | 2024.11.18 |
mysql 리액트 만나이 계산 (0) | 2024.11.11 |