2009-03-03 74 views
1

我知道這裏有一些關於選擇記錄的帖子,直到從一個字段的總和中滿足某個數字,但沒有任何適合我的記錄。我使用PHP和MySQL。從MySQL記錄中選擇總和

我有一個名爲數量的表。裏面有產品名稱,產品價格和產品數量的記錄。除此之外,還有一些可幫助我根據日期和位置選擇最後的記錄,還可以根據名爲價格的字段選擇最後的記錄,因爲同一產品有不同的數量和不同的價格。所以,我現在選擇我的產品的具體價格和數量是這樣的:

SELECT `price`,`quantity` FROM (SELECT `price`,`quantity` FROM `quantity` WHERE `product_name` = 'DELL' ORDER BY `date` DESC, `position`) AS `Actions` GROUP BY `price` 

這個查詢是一個解決方法,因爲我需要得到這樣的數據:

product_name | price | quantity 

DELL   |  100 |  30 
DELL   |  120 |  10 
DELL   |  130 |  2 

asuming我有多個記錄,像這樣的我需要得到他們最新的。無論如何,從這個查詢我需要做到以下幾點:我需要選擇數量與其他產品的數量總和等於35的記錄。因此,通過使用我的查詢,我知道它應該停在第2行,因爲我可以將30個產品價格爲100美元,另有5件產品的價格爲120美元。然後我需要輸入我的更新。因此,新數據應該如下所示:

product_name | price | quantity 

DELL   |  100 |  0 
DELL   |  120 |  5 
DELL   |  130 |  2 

在這個世界上我將如何實現這個目標?我希望我的細節清楚。請提出任何問題。

謝謝你的時間!

回答

1

方法1:使用程序邏輯,而不是一個查詢:

有什麼不妥使用編程層做更先進的數據庫交互。 SQL不是對所有東西的答案......(也考慮存儲過程)。

enough = 35 
running_total = 0 

START TRANSACTION 
while running_total < enough: 
    select one record order by price limit 1 FOR UPDATE 
    add to running_total 

UPDATE records... 
COMMIT 

選項2:使用查詢與運行總計:

在這個選項中,你得到的運行總計使用派生的查詢,然後篩選到特定記錄外部查詢。如果您打算更新它們,則應該將其包含在具有正確隔離級別的事務中。

SET @running_total = 0; 
SELECT 
    row_id, 
    product_name, 
    price, 
    quantity 
FROM 
    (
    SELECT 
     row_id, 
     product_name, 
     price, 
     quantity, 
     @running_total := @running_total + quantity AS running_total 
    FROM 
     sometable 
    WHERE 
     quantity > 0 
    ORDER BY 
     quantity 
    LIMIT 
     35 /* for performance reasons :) */ 
    ) as T1 
WHERE 
    running_total < 35 

我會傾向於選擇選項1,因爲它更「顯而易見」,但或許這會給你思考的一些食物。

+0

我已經使用了第一種方法。儘管如此,我還有很多工作要做。無論如何,這幫助我開始。謝謝 – 2009-03-03 14:56:47