2014-08-29 116 views
1

我想在SQL select子句中產生一個增量計數器(在下面的查詢中列'rownum')。每當新用戶切換時計數器應該開始。MySQL簡單的行號增量計數器

SELECT * FROM (
    SELECT CONCAT(' ',g.node1,' ',g.node2), 
    @r:= CASE WHEN @g = g.`user` THEN @r +1 ELSE 1 END rownum, 
    @g:= g.`user` user_group 
    FROM sn.sn_graph_reduced g 
    CROSS JOIN (SELECT @g:=0,@r:=0) t2 
    ORDER BY `user` , RAND() 
    ) t 
    WHERE rownum <= 100 

然而,上述代碼段返回的行號,並且由於記錄被隨機取樣,行號不遞增。 我需要的是每個返回的行都有一個簡單的計數器(1,2,3 ....)。 感謝

+0

http://stackoverflow.com/questions/16880080/how-to-get-mysql-rownum-continously-over-the-pagenation – ntalbs 2014-08-29 03:50:10

回答

2

嘗試把變量內嵌視圖之外:

SELECT t.*, 
     @r:= CASE WHEN @t = t.`user` THEN @r +1 ELSE 1 END rownum, 
     @t:= t.`user` user_group 
FROM (
     SELECT CONCAT(' ',g.node1,' ',g.node2), g.`user` 
     FROM sn.sn_graph_reduced g 
     ORDER BY `user` , RAND() 
     ) t 
CROSS JOIN (SELECT @t:=0,@r:=0) t2 
where rownum <= 100 
+0

計數器來好了,但是該查詢僅返回第一個用戶的100條記錄(有27個用戶,所以我期望2700條記錄) – user3628777 2014-08-29 04:02:28

+0

@ user3628777嘗試我的編輯,對不起,我認爲你的「where rownum <= 100」的目的是將結果限制爲100行,但我認爲它實際上限制結果爲100組? – 2014-08-29 04:05:59

0

用於遞增行數不與RAND應付方法()直接,所以從蘭特(),爲列中使用的值。還要啓動@g爲''不爲零,然後您需要最終的ORDER BY。

SELECT 
     * 
FROM (
      SELECT 
        CONCAT(' ', g.node1, ' ', g.node2) AS node_concat 
       , @r:= IF(@g = g.`user`, @r + 1, 1)  AS rownum 
       , @g:= g.`user`       AS user_group 
      FROM (
        SELECT *, rand() AS R FROM sn_graph_reduced 
        ) g 
        CROSS JOIN (SELECT @g:= '' ,@r:= 1) t2 
      ORDER BY 
        `user` 
       , R 
    ) t 
WHERE rownum <= 100 
ORDER BY 
     user_group 
    , rownum 
; 

見:This SQLfiddle

+0

偉大的人,這是一個查詢的地獄:-)謝謝 – user3628777 2014-08-29 07:38:24

+0

沒問題,我發現如果結合行計算與rand(),它只是不像你所期望的那樣工作。所以你可以嗎?蜱總是很好得:) – 2014-08-29 07:48:26