Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL简单行数增量计数器_Mysql_Sql_Random_Row Number - Fatal编程技术网

MySQL简单行数增量计数器

MySQL简单行数增量计数器,mysql,sql,random,row-number,Mysql,Sql,Random,Row Number,我试图在下面的查询中,在SQL select子句中生成一个增量计数器列“rownum”。每次新用户切换时,计数器都应重新启动 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_redu

我试图在下面的查询中,在SQL select子句中生成一个增量计数器列“rownum”。每次新用户切换时,计数器都应重新启动

    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。。。。对于返回的每一行。
谢谢

尝试将变量置于内联视图之外:

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

增加行数的方法不能直接处理RAND,所以使用RAND中的值作为列。也可以将@g初始化为非零,然后您需要一个最终订单

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
;

请参阅:

计数器显示得很好,但查询只返回第一个用户的100条记录,其中有27个用户,因此我预计为2700条records@user3628777请尝试我的编辑,抱歉,我认为where rownum的用途没有问题,我发现如果将行计算与rand结合起来,它就不能像您预期的那样工作。你觉得没问题吧?打勾总是很好的: