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

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

khach san

CSDL :

hotel

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 ) ;

tblhotel

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;

tblhotelupdate

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

delete

Câu lệnh Select :

tonghop

Tìm toàn bộ người dùng có tên chứa chữ “ a ”
SELECT * FROM tbluser
WHERE fullname LIKE “ % a % ” ;

1

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ả

se

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ả :

2

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 :

  1. 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 :

Share this:

Thích bài này:

Thích

Đang tải …

Source: https://mix166.vn
Category: Hỏi Đáp

Xổ số miền Bắc