Bài toán quản lí khách sạn
Bài toán:
Một khách sạn (id, tên, địa chỉ, số sao, mô tả) có nhiều phòng (id, hạng phòng, giá niêm yết, mô tả)
Mỗi phòng có thể được đặt bởi nhiều khách hàng (id, tên, số id, kiểu thẻ id, địa chỉ, mô tả) tại nhiều thời điểm khác nhau
Mỗi khách hàng có thể đặt nhiều phòng tại nhiều thời điểm khác nhau nhưng chỉ ở 1 phòng tại 1 thời điểm nhất định, xác định 1 giá xác định
Khách hàng chỉ có thể đặt phòng nếu phòng còn trống trong suốt thời gian khách hàng muốn đặt
Khi trả phòng, nhân viên in phiếu thanh toán bao gồm tên khách sạn, tên khách hàng, số phòng, hạng phòng, ngày đến, ngày đi và tổng số tiền thanh toán
Khách hàng hoàn toàn có thể giao dịch thanh toán nhiều lần cho đến trước ngày trả phòng
Nếu hủy đặt phòng sẽ bị phạt, tùy vào thời hạn hủy sớm hay muộn
Bạn đang đọc: Bài toán quản lí khách sạn
Trước hết cần có 3 bảng:
tblHotel: id, name, starLevel, address, description
tblRoom: id, name, type, displayPrice, description
tblUser: id, fullName, username, password, idCardNumber, idCardType,
address, description
Nhận xét:
1 khách sạn có nhiều phòng, 1 phòng chỉ ở trong 1 khách sạn →
quan hệ giữa bảng tblHotel và tblRoom là 1-n
1 khách hàng đặt nhiều phòng, 1 phòng cũng có nhiều người đặt →
quan hệ giữa tblRoom và tblUser là n-n, → phải chuẩn hóa
→ Tạo thêm một bảng đặt chỗ chi tiết tblBooking: idRoom, idUser,
startDate, endDate, price, description
→ quan hệ giữa tblRoom và tblBooking là 1-n (một phòng có nhiều lần đặt),
và giữa tblUser và tblBooking cũng là 1-n (một người có nhiều lần
đặt)
Thêm 1 bảng:
tblBill: id, idBooking, paymentDate, amount, paymentType, notes
Nhận xét:
l 1 đặt phòng có thể trả tiền nhiều lần (đặt cọc, trả trước, thành toán khi ở xong) → quan hệ giữa bảng tblBooking và tblBill là1-n
Sơ đồ lớp
CSDL :
Câu lệnh SQL:
Thêm 1 khách sạn vào bảng Hotel
INSERT INTO ` tblhotel ` ( ` address `, ` id `, ` name `, ` starLevel `, ) VALUES ( “ SAI GON ”, 5, ” SaiGon Star ”, 3 ) ;
Sửa một khách sạn đã có trong bảng tblHotel:
UPDATE `tblhotel`
SET `address` = “Quận 1, TP. Hồ Chí Minh”
WHERE id = 5;
Xóa một khách sạn trong bảng tblHotel:
DELETE FROM `tblhotel`
WHERE id = 5;
Tương tự tổng hợp được những bảng
Câu lệnh Select :
Tìm toàn bộ người dùng có tên chứa chữ “ a ”
SELECT * FROM tbluser
WHERE fullname LIKE “ % a % ” ;
Câu 1: Tìm tất cả người dùng đã đặt phòng từ 15/8/2013 – 30/8/2013
Phân tích :
- Câu lệnh select
- Các bảng liên quan : tbluser, tblbooking(tblRoom) liên hệ qua các id khóa ngoại trong bảng csdl
- Cần lấy ra : tên người đặt phòng, phòng nào, thỏa mãn khoảng thời gian 15/8-30/8/2013
Câu lệnh :
Từ 3 bảng tbluser, tblBooking, tblRoom lấy ra thuộc tính :
- Tên user,địa chỉ từ bảng (tbluser -a)
- Tên phòng, loại phòng (tblroom-b)
- Ngày đặt, ngày trả phòng, giá phòng(tblBooking-c)
Với điều kiện kèm theo : ngày đặt phòng và ngày trả phòng trong khoảng chừng 15-30 / 8/2013
Các câu hỏi lần lượt
- Lấy cái gì(select)?
- Lấy từ đâu(form)?
- Thỏa mãn điều kiện gì(where)?
- Liên kết các bảng ntn?(id)
Câu truy vấn :
SELECT a.fullname, a.address, b.name, b.type, c. startDate, c. endDate, c.price
FROM tblUser a, tblRoom b, tblBooking c
WHERE c. startDate BETWEEN “ 2013 – 08-15 ” AND “ 2013 – 08-30 ”
AND b.id = c. idRoom
AND a.id = c. idUser ;
Kết quả
Câu 2: Tìm kiếm và sắp xếp khách hàng đã trả tiền nhiều nhất đến ít nhất
Phân tích :
Loại truy vấn : select
Các bảng tương quan : tbluser, tblBooking, tblRoom, tblBill
Thuộc tính cần lấy : tên, địa chỉ, số thẻ, loại thẻ user, ngày đặt, ngày trả, giá giao dịch thanh toán ( Booking ), tổng số tiền đã trả ( Bill )
Không cần điều kiện kèm theo
Câu truy vấn :
SELECT a.id, a.fullname, a. idCardNumber, a. idCardType, a.address ,
SUM ( c.amount ) AS ( ` amount ` )
FROM tblUser a INNER JOIN tblBooking b ON b. idUser = a.id
INNER JOIN tblBill c ON c. idBooking = b.id
GROUP BY a.id, a. fullName, a. idCardNumber, a. idCardType, a.address ,
ORDER BY ` amount ` DESC
Kết quả :
GROUP BY nhóm tất cả thuộc tính trên SELECT (thực ra ý nghĩa: nhóm tất cả bản ghi có các thuộc tính: id, fullname, idCardNumber ,… thành 1 nhóm)
- Ngoài ra chỉ cần GROUP BY a.id là đủ rồi
ORDER BY : sắp xếp cột amount giảm dần
Bài tập :
- Tìm kiếm và sắp xếp những khách hàng đã trả tiền nhiều nhất đến
ít nhất trong khoảng thời gian từ ngày a đến ngày b?
2. Tìm kiếm và sắp xếp những phòng của một khách sạn X theo thứ
tự tổng số tiền thu được (từ cao đến thấp) từ ngày a đến ngày b?
3. Tìm kiếm và sắp xếp những phòng của một khách sạn X theo thứ
tự tổng số ngày có khách (từ cao đến thấp) tính từ ngày a đến ngày b?
Câu 1 :
Tương tự câu 1 nhưng có điều kiện kèm theo khoảng chừng thời hạn
SELECT a.id, a. fullName, a. idCardNumber, a. idCardType, a.address, b. startDate, b. endDate
SUM ( c.amount ) AS ` amount `
FROM tblUser a INNER JOIN tblBooking b ON b. idUser = a.id
INNER JOIN tblBill c ON c. idBooking = b.id
WHERE b. endDate BETWEEN “ a ” AND “ b ”
GROUP BY a.id, a. fullName, a. idCardNumber, a. idCardType, a.address, b. startDate, b. endDate
ORDER BY ` amount ` DESC
Câu 2 :
SELECT a.id, a.name, b. startDate, b. endDate ,
SUM ( c.amount ) AS ` amount `
FROM tblRoom a INNER JOIN tblBooking b ON b. idRoom = a.id
INNER JOIN tblBill c ON c. idBooking = b.id
WHERE c. endDate BETWEEN “ a ” AND “ b ”
GROUP BY a.id, a.name, b. startDate, b. endDate
ORDER BY ` amount ` DESC ;
Câu 3 :
Mục lục bài viết
Share this:
Thích bài này:
Thích
Đang tải …
Có liên quan
Source: https://mix166.vn
Category: Hỏi Đáp