Skip to content

Instantly share code, notes, and snippets.

@wuriyanto48
Last active August 20, 2024 16:56
Show Gist options
  • Save wuriyanto48/28e928efe2b2135f163250dd60f7e411 to your computer and use it in GitHub Desktop.
Save wuriyanto48/28e928efe2b2135f163250dd60f7e411 to your computer and use it in GitHub Desktop.
SQL Pagination

Bagaimana Pagination pada Database bekerja.

Data

id sku name quantity
1 001 A 10
2 002 B 10
3 003 C 10
4 004 D 10
5 005 E 10
6 006 F 10
7 007 G 10
8 008 H 10
9 009 I 10
10 010 J 10
11 011 K 10
12 012 L 10
13 013 M 10
14 014 N 10
15 015 O 10
16 016 P 10
17 017 Q 10
18 018 R 10
19 019 S 10
20 020 T 10
21 021 U 10
22 022 V 10
23 023 W 10
24 024 X 10
25 025 Y 10
26 026 Z 10

Pada data diatas, kita memiliki 26 baris data.

Untuk menentukan berapa jumlah halaman (total_page), cukup kita bagi jumlah baris (total_data) dibagi dengan jumlah baris (page_size) pada setiap halaman.

SELECT COUNT(SKU) as total_data FROM products;

| total_data |
| ---------- |
| 26         |

Sebagai contoh kita akan menampilkan 5 baris (page_size) pada setiap halaman.

Maka kita akan bagi total_data = 26 dengan 5, kemudian melakukan pembulatan keatas dengan function CEIL.

Sehingga menghasilkan berapa jumlah halaman (total_page) pada data kita. Dengan total_data = 26 dan kita akan menampilkan 5 baris data pada setiap halamannya, maka kita akan memiliki jumlah halaman (total_page = 5).

SELECT CEIL(26/5) AS TOTAL_PAGE;

| total_page |
| ---------- |
| 5          |

LIMIT dan OFFSET clause

LIMIT clause berfungsi mengembalikan berapa banyak jumlah baris yang akan ditampilkan.

OFFSET clause berfungsi menentukan jumlah data yang akan dilewati atau dilompati.

Cara kerja OFFSET yaitu melewati berapa banyak data yang telah di tentukan. Contoh melakukan OFFSET 5 data pada data berikut.

data: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

OFFSET = 5

hasil = 6, 7, 8, 9, 10

Maka untuk menampilkan data pada page tertentu, kita akan tentukan value dari OFFSET dengan logic berikut.

OFFSET = (page - 1) * page_size

Pagination

Menampilkan data halaman ke 1

    SELECT SKU, NAME, QUANTITY, (SELECT COUNT(SKU) FROM products) AS TOTAL_DATA,
    	(SELECT 1) AS PAGE,
        (SELECT 5) AS PAGE_SIZE,
    	(SELECT CEIL(26/5)) AS TOTAL_PAGE FROM products
    	LIMIT 5 OFFSET (1-1)*5;
sku name quantity total_data page page_size total_page
001 A 10 26 1 5 5
002 B 10 26 1 5 5
003 C 10 26 1 5 5
004 D 10 26 1 5 5
005 E 10 26 1 5 5

Menampilkan data halaman ke 2

    SELECT SKU, NAME, QUANTITY, (SELECT COUNT(SKU) FROM products) AS TOTAL_DATA,
    	(SELECT 2) AS PAGE,
        (SELECT 5) AS PAGE_SIZE,
    	(SELECT CEIL(26/5)) AS TOTAL_PAGE FROM products
    	LIMIT 5 OFFSET (2-1)*5;
sku name quantity total_data page page_size total_page
006 F 10 26 2 5 5
007 G 10 26 2 5 5
008 H 10 26 2 5 5
009 I 10 26 2 5 5
010 J 10 26 2 5 5

Menampilkan data halaman ke 2

    SELECT SKU, NAME, QUANTITY, (SELECT COUNT(SKU) FROM products) AS TOTAL_DATA,
    	(SELECT 3) AS PAGE,
        (SELECT 5) AS PAGE_SIZE,
    	(SELECT CEIL(26/5)) AS TOTAL_PAGE FROM products
    	LIMIT 5 OFFSET (3-1)*5;
sku name quantity total_data page page_size total_page
011 K 10 26 3 5 5
012 L 10 26 3 5 5
013 M 10 26 3 5 5
014 N 10 26 3 5 5
015 O 10 26 3 5 5

View on DB Fiddle

DDL and DML

CREATE TABLE products (
  id SERIAL PRIMARY KEY, 
  sku VARCHAR (50) UNIQUE NOT NULL, 
  name VARCHAR (50) NOT NULL, 
  quantity INTEGER DEFAULT 0 NOT NULL
);

INSERT INTO products(sku, name, quantity) VALUES('001', 'A', 10);
INSERT INTO products(sku, name, quantity) VALUES('002', 'B', 10);
INSERT INTO products(sku, name, quantity) VALUES('003', 'C', 10);
INSERT INTO products(sku, name, quantity) VALUES('004', 'D', 10);
INSERT INTO products(sku, name, quantity) VALUES('005', 'E', 10);
INSERT INTO products(sku, name, quantity) VALUES('006', 'F', 10);
INSERT INTO products(sku, name, quantity) VALUES('007', 'G', 10);
INSERT INTO products(sku, name, quantity) VALUES('008', 'H', 10);
INSERT INTO products(sku, name, quantity) VALUES('009', 'I', 10);
INSERT INTO products(sku, name, quantity) VALUES('010', 'J', 10);
INSERT INTO products(sku, name, quantity) VALUES('011', 'K', 10);
INSERT INTO products(sku, name, quantity) VALUES('012', 'L', 10);
INSERT INTO products(sku, name, quantity) VALUES('013', 'M', 10);
INSERT INTO products(sku, name, quantity) VALUES('014', 'N', 10);
INSERT INTO products(sku, name, quantity) VALUES('015', 'O', 10);
INSERT INTO products(sku, name, quantity) VALUES('016', 'P', 10);
INSERT INTO products(sku, name, quantity) VALUES('017', 'Q', 10);
INSERT INTO products(sku, name, quantity) VALUES('018', 'R', 10);
INSERT INTO products(sku, name, quantity) VALUES('019', 'S', 10);
INSERT INTO products(sku, name, quantity) VALUES('020', 'T', 10);
INSERT INTO products(sku, name, quantity) VALUES('021', 'U', 10);
INSERT INTO products(sku, name, quantity) VALUES('022', 'V', 10);
INSERT INTO products(sku, name, quantity) VALUES('023', 'W', 10);
INSERT INTO products(sku, name, quantity) VALUES('024', 'X', 10);
INSERT INTO products(sku, name, quantity) VALUES('025', 'Y', 10);
INSERT INTO products(sku, name, quantity) VALUES('026', 'Z', 10);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment