Câu trả lời ngắn, có câu trả lời
dài hơn, bạn có thể sử dụng một biến để kiểm đếm nó lên như nó lặp xuống dòng, tức là
SELECT
`table`.`ID`,
`table`.`In`,
`table`.`Out`,
@Balance := @Balance + `table`.`In` - `table`.`Out` AS `Balance`
FROM `table`, (SELECT @Balance := 0) AS variableInit
ORDER BY `table`.`ID` ASC
Các , (SELECT @Balance := 0) AS variableInit
đảm bảo rằng @Balance được khởi tạo vào 0 trước bạn bắt đầu. Đối với mỗi hàng, nó sẽ đặt @Balance thành @Balance + In - Out
và sau đó xuất ra giá trị được tính.
Cũng đáng để đảm bảo rằng ORDER nhất quán nếu không, Số dư sẽ khác nhau tùy thuộc vào thứ tự các hàng được trả về. Nếu bạn muốn sau đó đặt nó trở lại phía trước, ví dụ, bạn có thể sử dụng điều này như một subquery như sau đó các giao dịch truy vấn bên ngoài với các giá trị tính toán đảm bảo các cân đối vẫn còn đúng nghĩa là
SELECT
`balanceCalculation`.`ID`,
`balanceCalculation`.`In`,
`balanceCalculation`.`Out`,
`balanceCalculation`.`Balance`
FROM (
SELECT
`table`.`ID`,
`table`.`In`,
`table`.`Out`,
@Balance := @Balance + `table`.`In` - `table`.`Out` AS `Balance`
FROM `table`, (SELECT @Balance := 0) AS variableInit
ORDER BY `table`.`ID` ASC
) AS `balanceCalculation`
ORDER BY `balanceCalculation`.`ID` DESC
Nguồn
2012-02-22 12:11:13
cách với pagination, tôi nghĩ rằng truy vấn này sẽ không hoạt động tốt, sự cân bằng sẽ không tiến triển tốt –
@PutraLZendrato Tôi sợ tôi không hiểu câu hỏi –
Xin chào Simon, ý tôi là, làm thế nào nếu các dữ liệu hàng là lớn, Ví dụ, chúng tôi có 100 dữ liệu, nhưng sẽ không tải trong một trang. Vì vậy, chúng tôi tách thành 2 trang (phân trang làm việc). Tôi nghĩ rằng số dư hoạt động sẽ không hoạt động. –