10/10/2018, 11:15

Hỏi về câu lệnh SQL

Nhờ các bác giúp tôi một chút

Đây là một bảng dùng để quản lý hàng tồn kho, có dạng :

Mã hàng Số lượng Giờ Ngày
AAA 1000 21:30:08 05/24/2011
BBB 3000 21:05:31 05/24/2011
AAA 1500 20:10:22 05/24/2011
AAA 1800 20:00:46 05/24/2011
CCC 2200 19:28:52 05/24/2011
BBB 2600 19:16:23 05/24/2011
CCC 1500 19:07:46 05/24/2011
CCC 3200 19:03:55 05/24/2011
BBB 2600 18:11:31 05/24/2011

Số lượng từng mặt hàng sẽ tăng hoặc giảm tùy theo tình hình nhập/xuất. Bây giờ nếu muốn lấy ra số lượng mỗi mặt hàng vào cuối ngày 24/05, sẽ cần lấy ra các records AAA, BBB, CCC ở thời điểm cuối cùng trong ngày mà chúng chịu tác động tăng/giảm.

Vậy, phải viết câu lệnh SQL như thế nào để cho ra kết quả mong muốn mà không phải truy vấn nhiều lần theo từng mã hàng?
ngoc_viet08 viết 13:26 ngày 10/10/2018
thường khi xây dựng bảng , người ta nhóm chung cột date với time chung. sử dụng kiểu datetime .
từ cột datetime , chỉ vài dòng php đơn giản đều có thể xuất ra time or date or anything dễ dàng.

vấn đề của bạn giờ chỉ còn là order by blah blah blah

tham khảo mysql datetime
gyarcier viết 13:31 ngày 10/10/2018
Được gửi bởi ngoc_viet08
thường khi xây dựng bảng , người ta nhóm chung cột date với time chung. sử dụng kiểu datetime .
từ cột datetime , chỉ vài dòng php đơn giản đều có thể xuất ra time or date or anything dễ dàng.

vấn đề của bạn giờ chỉ còn là order by blah blah blah

tham khảo mysql datetime

Đấy là tôi minh họa như nhìn từ phía ngoài giao diện người dùng, còn trong db thì phải timestamp hết chứ bác.

Cái khó ở đây là làm sao tối ưu hóa câu lệnh SQL. Nếu phải dùng 3 câu lệnh cho 3 sản phẩm để lấy ra con số tồn kho cuối ngày của sản phẩm đó thì không ổn. Vì thực tế có hàng ngàn mặt hàng chứ không ít.

Nếu phải thiết kế lại db thì theo các bác nên thiết kế thế nào cho mục đích trên dễ đạt được?
fotech_nd viết 13:27 ngày 10/10/2018
Được gửi bởi gyarcier
Nhờ các bác giúp tôi một chút
Thử viết như thế này xem có OK ko nhé.
Code:
SELECT t.*, t2.SoLuong
FROM (
    SELECT t1.MaHang, MAX(t1.NgayGio) AS LastTime
    FROM `hanghoa` AS t1
    WHERE DATE(t1.NgayGio) = '2011-05-24'
    GROUP BY t1.MaHang, DATE(t1.NgayGio)
) AS t
INNER JOIN `hanghoa` AS t2 ON t2.MaHang = t.MaHang
AND t2.NgayGio = t.LastTime
suutamcongnghe viết 13:30 ngày 10/10/2018
Hic, cái bảng tồn kho này tui mới thấy. Quản lý kiểu này rối còn hơn là không quản lý
gyarcier viết 13:16 ngày 10/10/2018
Cảm ơn bạn, fotech_nd, để tớ thử xem thế nào. Chưa bao giờ tớ viết nổi 1 câu lệnh SQL phức tạp như vậy

@ suutamcongnghe : bạn có kinh nghiệm thì gợi ý cho tớ chút, đang bí. Project này khá độc đáo, yêu cầu dạng webApp, dùng Javascript/Gear DB để làm việc trên web browser, không có server script gì cả Đúng sở trường nên tớ nhận đại. Nhưng mà chưa có kinh nghiệm quản lý kho bao giờ. Chỉ biết đại khái về xuất-nhập-tồn, tạm thời làm thử mấy cái bảng lưu lại từng sự kiện trong ngày xem sao đã.
suutamcongnghe viết 13:31 ngày 10/10/2018
Theo mình thì có 2 table chính là NHẬP & XUẤT (2 bảng chính, chi tiết thì phải có 2 bảng phụ kèm theo là CHITIẾTNHẬP & CHITIẾTXUẤT, ở đây mình chỉ nói chung thôi nha)
Trong đó có các field là ID, Mãhàng, Sốlượng, Đơngiá, Ngày (tất nhiên là có giờ)
Và 1 query TỒN. Cái tồn này, cần lúc nào thì query lúc đó.
ngoc_viet08 viết 13:20 ngày 10/10/2018
hình như cậu lưu data dạng :
số tồn sản phẩm x ngày 1-1-2011 là 300
số tồn sản phẩm x ngày 2-1-2011 là 500
số tồn sản phẩm y ngày 2-1-2011 là 300
số tồn sản phẩm x ngày 3-1-2011 là 200
...

mỗi lần nhập xuất sẽ lấy số tồn mới nhất rồi +/- rùi save lại.

nếu làm vậy thì cậu làm phức tạp bài toán ,thường người ta sẽ build table theo dạng action
nhập 300 sản phẩm x ngày 1-1-2011
xuất 200 sản phẩm x ngày 2-1-2011
nhập 300 sản phẩm y ngày 3-1-2011
xuất 100 sản phẩm x ngày 4-1-2011

và 1 table khác
sản phẩm x hiện thời là 1000
sản phẩm y hiện thời là 1500

như vậy các query đơn giản và dễ tính toán.
gyarcier viết 13:17 ngày 10/10/2018
Cảm ơn các bác đã gợi ý
Bài liên quan
0