Tôi đang thiết kế giỏ hàng. Để phá vỡ vấn đề hóa đơn cũ cho thấy giá không chính xác sau khi giá của sản phẩm bị thay đổi, tôi đã di chuyển trường giá từ bảng Product thành bảng ProductPrice bao gồm 3 trường, pid, date và price. pid và ngày tạo thành khóa chính cho bảng. Dưới đây là một ví dụ về những gì bàn trông giống như:Vấn đề SQL "GROUP BY"
pid date price
1 1/1/09 50
1 2/1/09 55
1 3/1/09 54
Sử dụng SELECT
và GROUP BY
để tìm ra giá mới nhất của từng sản phẩm, tôi đã đưa ra:
SELECT pid, price, max(date) FROM ProductPrice GROUP BY pid
Ngày và PID trở là chính xác. Tôi nhận được chính xác 1 mục nhập cho mỗi pid duy nhất và ngày kèm theo đó là ngày mới nhất cho pid đó. Tuy nhiên, điều ngạc nhiên là giá đã quay trở lại. Nó trả lại giá hàng đầu tiên phù hợp với pid, mà trong trường hợp này là 50.
Sau khi làm lại tuyên bố của tôi, tôi đã đưa ra với điều này:
SELECT pp.pid, pp.price, pp.date FROM ProductPrice AS pp
INNER JOIN (
SELECT pid AS lastPid, max(date) AS lastDate FROM ProductPrice GROUP BY pid
) AS m
ON pp.pid = lastPid AND pp.date = lastDate
Trong khi tuyên bố làm lại tại mang lại giá đúng (54), có vẻ như không thể tin được rằng một truy vấn âm thanh đơn giản như vậy sẽ đòi hỏi một sự tham gia bên trong để thực thi. Câu hỏi của tôi là, câu nói thứ hai của tôi là cách dễ nhất để hoàn thành những gì tôi cần làm? Hay tôi đang thiếu thứ gì đó ở đây? Cảm ơn trước!
James
đơn giản hơn, mặc dù chỉ trên Postgresql: CHỌN DIỆT TRÊN (pid) pid, ngày, giá FROM ProductPrice ORDER BY pid, ngày DESC –