在mysql查询中生成序列号

时间:2012-06-19 04:39:31

标签: mysql sql

我有一张桌子:student_marks

marks
-----
  44
  55
  64
  98
  76

预期产出:

serial_number|marks
--------------------
  1          | 44
  2          | 55
  3          | 64
  4          | 98
  5          | 76

使用mysql用户定义的变量,可以使用查询来完成:

 set  @a:=0;select @a:=@a+1 serial_number, marks from student_marks;

有没有办法在msyql中实现这一点而不使用用户定义的变量?

10 个答案:

答案 0 :(得分:58)

根据您不希望使用用户定义变量的原因,希望避免有2个查询,一个用于初始化,一个用于使用它,您可以使用以下内容:

SELECT  @a:=@a+1 serial_number, 
        marks 
FROM    student_marks,
        (SELECT @a:= 0) AS a;

答案 1 :(得分:5)

这个问题的最佳答案应该是以下,最佳实践

SET @count:=0;
SELECT  (@count:=@count+1) AS serial_number, 
        marks 
FROM    student_marks

答案 2 :(得分:0)

不,没有。但是你可以在程序端产生serial_number,而不是数据库端。

答案 3 :(得分:0)

为什么不将它设为自动增量字段?

http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

答案 4 :(得分:0)

我有一个带有列的表(c5)包含一个数字x,我需要一个重复相同行x次的sql表达式:

我的表A包含:

local dom

我需要:

c1  c2  c3  c4  c5
16  1   2   16  3
16  1   2   17  2 
16  1   2   18  1

我用表达式解决了这个问题:

c1  c2  c3  c4  c5  n
16  1   2   16  3   1
16  1   2   16  3   2
16  1   2   16  3   3
16  1   2   17  2   1
16  1   2   17  2   2
16  1   2   18  1   1

答案 5 :(得分:0)

以上答案均未令人满意,因为您需要在单独的查询中将变量初始化为null。

因此发布以下所有解决方案:

SELECT ROUND(@a:=@a+1,0) sr_num, t.* from (select @a:=0) initvars, your_table t;

答案 6 :(得分:0)

在mysql 5.6中进行了测试:

SELECT
    @a:=@a+1 as serial_number,
    student.* 
FROM
    student
join (SELECT @a:= 0) a

答案 7 :(得分:0)

您可以使用此查询添加 serial number

set @counter=0;
SELECT  @counter:=@counter+1 as serial_number from <table_name>

输出:

   |...............................|
   | serial_number  |   first_name |
   |...............................|
   |      1         |    mojtaba   |
   |      2         |    athena    |
   |      3         |     azin     |
   |      4         |     ava      |
   |      5         |    arash     |
   |...............................|

另外如果你想在 where

set @counter=0;
select serial_number from (SELECT  @counter:=@counter+1 as serial_number 
from <table_name>) as tbl_counter where serial_number > 3

输出:

   |...............................|
   | serial_number  |   first_name |
   |...............................|
   |      4         |     ava      |
   |      5         |    arash     |
   |...............................|

答案 8 :(得分:-1)

不,除非您有一个包含这些数字的列。

答案 9 :(得分:-1)

虽然答案很晚,但是在没有两个查询且没有使用连接且不使用子查询的情况下生成顺序ID。

SELECT *, (@cnt := if(@cnt IS NULL, 0,  @cnt) + 1) AS id FROM table_name;

干杯