├── notification.puml └── notification.sql /notification.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | entity User { 4 | * id VARCHAR(100) <> 5 | -- 6 | * name VARCHAR(100) 7 | } 8 | 9 | entity Notification { 10 | * id INT AUTO INCREMENT <> 11 | -- 12 | * title VARCHAR(255) 13 | * detail TEXT 14 | * create_at TIMESTAMP 15 | -- 16 | user_id VARCHAR(100) <> 17 | category_id VARCHAR(100) <> 18 | } 19 | 20 | entity Category { 21 | * id VARCHAR(100) <> 22 | -- 23 | * name VARCHAR(100) 24 | } 25 | 26 | entity NotificationRead { 27 | * id INT AUTO INCREMENT <> 28 | -- 29 | * is_read BOOLEAN 30 | -- 31 | * notification_id INT <> 32 | * user_id VARCHAR(100) <> 33 | } 34 | 35 | User ||--o{ Notification 36 | Category ||-o{ Notification 37 | Notification ||-o{ NotificationRead 38 | User ||--o{ NotificationRead 39 | 40 | @enduml -------------------------------------------------------------------------------- /notification.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE belajar_mysql_notification; 2 | 3 | USE belajar_mysql_notification; 4 | 5 | SHOW TABLES; 6 | 7 | # User 8 | 9 | CREATE TABLE user 10 | ( 11 | id VARCHAR(100) NOT NULL, 12 | name VARCHAR(100) NOT NULL, 13 | PRIMARY KEY (id) 14 | ) ENGINE = InnoDB; 15 | 16 | SHOW TABLES; 17 | 18 | INSERT INTO user(id, name) 19 | VALUES ('eko', 'Eko Kurniawan'); 20 | INSERT INTO user(id, name) 21 | VALUES ('khannedy', 'Eko Khannedy'); 22 | 23 | SELECT * 24 | FROM user; 25 | 26 | # Notification 27 | 28 | CREATE TABLE notification 29 | ( 30 | id INT NOT NULL AUTO_INCREMENT, 31 | title VARCHAR(255) NOT NULL, 32 | detail TEXT NOT NULL, 33 | create_at TIMESTAMP NOT NULL, 34 | user_id VARCHAR(100), 35 | PRIMARY KEY (id) 36 | ) ENGINE = InnoDB; 37 | 38 | SHOW TABLES; 39 | 40 | ALTER TABLE notification 41 | ADD CONSTRAINT fk_notification_user 42 | FOREIGN KEY (user_id) REFERENCES user (id); 43 | 44 | DESC notification; 45 | 46 | INSERT INTO notification(title, detail, create_at, user_id) 47 | VALUES ('Contoh Pesanan', 'Detail Pesanan', CURRENT_TIMESTAMP(), 'eko'); 48 | INSERT INTO notification(title, detail, create_at, user_id) 49 | VALUES ('Contoh Promo', 'Detail Promo', CURRENT_TIMESTAMP(), null); 50 | INSERT INTO notification(title, detail, create_at, user_id) 51 | VALUES ('Contoh Pembayaran', 'Detail Pembayaran', CURRENT_TIMESTAMP(), 'khannedy'); 52 | 53 | SELECT * 54 | FROM notification; 55 | 56 | SELECT * 57 | FROM notification 58 | WHERE (user_id = 'eko' OR user_id IS NULL) 59 | ORDER BY create_at DESC; 60 | 61 | SELECT * 62 | FROM notification 63 | WHERE (user_id = 'khannedy' OR user_id IS NULL) 64 | ORDER BY create_at DESC; 65 | 66 | # Category 67 | 68 | CREATE TABLE category 69 | ( 70 | id VARCHAR(100) NOT NULL, 71 | name VARCHAR(100) NOT NULL, 72 | PRIMARY KEY (id) 73 | ) ENGINE = InnoDB; 74 | 75 | SHOW TABLES; 76 | 77 | ALTER TABLE notification 78 | ADD COLUMN category_id VARCHAR(100); 79 | 80 | DESCRIBE notification; 81 | 82 | ALTER TABLE notification 83 | ADD CONSTRAINT fk_notification_category 84 | FOREIGN KEY (category_id) REFERENCES category (id); 85 | 86 | DESC notification; 87 | 88 | SELECT * 89 | FROM notification; 90 | 91 | INSERT INTO category(id, name) 92 | VALUES ('INFO', 'Info'); 93 | INSERT INTO category(id, name) 94 | VALUES ('PROMO', 'Promo'); 95 | 96 | SELECT * 97 | FROM category; 98 | 99 | UPDATE notification 100 | SET category_id = 'INFO' 101 | WHERE id = 1; 102 | 103 | UPDATE notification 104 | SET category_id = 'PROMO' 105 | WHERE id = 2; 106 | 107 | UPDATE notification 108 | SET category_id = 'INFO' 109 | WHERE id = 3; 110 | 111 | SELECT * 112 | FROM notification; 113 | 114 | SELECT * 115 | FROM notification 116 | WHERE (user_id = 'eko' OR user_id IS NULL) 117 | ORDER BY create_at DESC; 118 | 119 | SELECT * 120 | FROM notification n 121 | JOIN category c ON (n.category_id = c.id) 122 | WHERE (n.user_id = 'eko' OR n.user_id IS NULL) 123 | ORDER BY n.create_at DESC; 124 | 125 | SELECT * 126 | FROM notification n 127 | JOIN category c ON (n.category_id = c.id) 128 | WHERE (n.user_id = 'khannedy' OR n.user_id IS NULL) 129 | ORDER BY n.create_at DESC; 130 | 131 | SELECT * 132 | FROM notification n 133 | JOIN category c ON (n.category_id = c.id) 134 | WHERE (n.user_id = 'khannedy' OR n.user_id IS NULL) 135 | AND c.id = 'INFO' 136 | ORDER BY n.create_at DESC; 137 | 138 | # Notification Read 139 | 140 | CREATE TABLE notification_read 141 | ( 142 | id INT NOT NULL AUTO_INCREMENT, 143 | is_read BOOLEAN NOT NULL, 144 | notification_id INT NOT NULL, 145 | user_id VARCHAR(100) NOT NULL, 146 | PRIMARY KEY (id) 147 | ) ENGINE = InnoDB; 148 | 149 | SHOW TABLES; 150 | 151 | ALTER TABLE notification_read 152 | ADD CONSTRAINT fk_notification_read_notification 153 | FOREIGN KEY (notification_id) REFERENCES notification (id); 154 | 155 | ALTER TABLE notification_read 156 | ADD CONSTRAINT fk_notification_read_user 157 | FOREIGN KEY (user_id) REFERENCES user (id); 158 | 159 | DESC notification_read; 160 | 161 | SELECT * 162 | FROM notification; 163 | 164 | INSERT INTO notification_read(is_read, notification_id, user_id) 165 | VALUES (true, 2, 'eko'); 166 | INSERT INTO notification_read(is_read, notification_id, user_id) 167 | VALUES (true, 2, 'khannedy'); 168 | 169 | SELECT * 170 | FROM notification_read; 171 | 172 | SELECT * 173 | FROM notification; 174 | 175 | SELECT * 176 | FROM notification n 177 | JOIN category c ON (n.category_id = c.id) 178 | LEFT JOIN notification_read nr ON (nr.notification_id = n.id) 179 | WHERE (n.user_id = 'eko' OR n.user_id IS NULL) 180 | AND (nr.user_id = 'eko' OR nr.user_id IS NULL) 181 | ORDER BY n.create_at DESC; 182 | 183 | INSERT INTO notification(title, detail, category_id, user_id, create_at) 184 | VALUES ('Contoh Pesanan Lagi', 'Detail Pesanan lagi', 'INFO', 'eko', CURRENT_TIMESTAMP()); 185 | INSERT INTO notification(title, detail, category_id, user_id, create_at) 186 | VALUES ('Contoh Promo Lagi', 'Detail Promo lagi', 'PROMO', null, CURRENT_TIMESTAMP()); 187 | 188 | # Counter 189 | 190 | SELECT COUNT(*) 191 | FROM notification n 192 | JOIN category c ON (n.category_id = c.id) 193 | LEFT JOIN notification_read nr ON (nr.notification_id = n.id) 194 | WHERE (n.user_id = 'eko' OR n.user_id IS NULL) 195 | AND (nr.user_id IS NULL) 196 | ORDER BY n.create_at DESC; 197 | 198 | SELECT * FROM notification; 199 | 200 | INSERT INTO notification_read(is_read, notification_id, user_id) 201 | VALUES (true, 4, 'eko'); 202 | INSERT INTO notification_read(is_read, notification_id, user_id) 203 | VALUES (true, 5, 'eko'); 204 | INSERT INTO notification_read(is_read, notification_id, user_id) 205 | VALUES (true, 1, 'eko'); --------------------------------------------------------------------------------