2012-07-28 76 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

相关问题