2012-07-28 75 views
1

我有以下查詢,該變量效果很好,如果我不使用ORDER BY子句後自我更新:是否有可能使用一個變量計數器,一個ORDER BY

集@a:= 0 ;

SELECT doc, @a as before, movement as mov, (@a:[email protected]+movement) as after, date 
FROM movements m 
LEFT JOIN (
SELECT doc, 1 as tdoc, date 
FROM invoices 
UNION ALL 
SELECT doc, 2 as tdoc, date 
FROM nulled 
) sub 
ON m.doc=sub.doc and m.doc_type = sub.tdoc 
WHERE m.product_id="XXXX" 

,所以我得到這樣的:

DOC BEFORE MOVEMENT AFTER DATE 
006 0  10  10 2012-07-01 
008 10  -3  7  2012-07-03 
015 7  5  12 2012-06-20 

但我想的動作來按日期,所以我在查詢的末尾包含按日期進行排序和獲取:

DOC BEFORE MOVEMENT AFTER DATE 
015 7  5  12 2012-06-20 
006 0  10  10 2012-07-01 
008 10  -3  7  2012-07-03 

,而不是我想要的東西:

DOC BEFORE MOVEMENT AFTER DATE 
015 0  5  5  2012-06-20 
006 5  10  15  2012-07-01 
008 15  -3  12  2012-07-03 

有沒有辦法得到這個?正在計算變量,然後結果被排序。有沒有辦法強制結果先排序,然後計算變量?

+1

如果MySQL最終到達21​​世紀並支持窗口函數,那將會容易得多。 – 2012-07-28 08:08:40

回答

3

您是否嘗試過移動子查詢上的順序?

例如

set @a:=0; 

SELECT doc, @a as before, mov, (@a:[email protected]+mov) as after, date 
FROM 
(
    SELECT doc, movement as mov, date 
    FROM movements m 
    LEFT JOIN (
    SELECT doc, 1 as tdoc, date 
    FROM invoices 
    UNION ALL 
    SELECT doc, 2 as tdoc, date 
    FROM nulled 
    ) sub 
    ON m.doc=sub.doc and m.doc_type = sub.tdoc 
    WHERE m.product_id="XXXX" 
    order by date 
) as x 
+0

完美!非常感謝! – ednincer 2012-07-30 06:21:35

相關問題