2011-10-06 120 views
2

我有这个疑问:MYSQL @变量来自不同客户采取不同的

SELECT @ROWNUM := CASE WHEN @PREV_CAT_ID=T1.category_id THEN @ROWNUM+1 ELSE 1 END AS RANK, 
    @PREV_CAT_ID:=T1.category_id, 
    T1.* 
    FROM(d.category_id 
     FROM some_table d, 
     (SELECT @ROWNUM := 0)R 
     ORDER BY d.category_id 
    }T1 

我想这个RANK列递增与同一CATEGORY_ID记录。当category_id增加时,我想排名重置为1并开始递增。

当我从TOAD执行我的查询时,但是当我的web应用程序或从phpMyAdmin执行时,RANK总是1,无论我做什么,这都很好用。

有没有人有任何想法,问题可能是什么?

谢谢!

+0

看来,它正常工作时,MySQL连接建立与mysql_pconnect而不是mysql_connect。 – Goran

回答

3

您应该每次重置所有变量(@ROWNUM@PREV_CAT_ID)。试试这个查询 -

SELECT 
    category_id, rank 
FROM (
    SELECT 
    category_id 
    , IF(@category_id = category_id, @num := @num + 1, @num := 1) AS rank 
    , @category_id := category_id 
    FROM some_table 
    CROSS JOIN (SELECT @num := 0, @category_id:= NULL) reset_all_vars 
    ORDER BY category_id 
) t; 
+0

+1非常好的代码。 – Johan

+0

+1此解决方案更简单,似乎正常工作(演示:http://sqlize.com/9Wh3WmRsUR)。 – mellamokb