33

我有一张桌子: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 中实现这一点?

4

11 回答 11

75

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

SELECT  @a:=@a+1 serial_number, 
        marks 
FROM    student_marks,
        (SELECT @a:= 0) AS a;
于 2012-06-19T07:45:10.153 回答
10

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

SET @count:=0;
SELECT  (@count:=@count+1) AS serial_number, 
        marks 
FROM    student_marks
于 2017-02-04T18:50:53.933 回答
1

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

我的表 A 包含:

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

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

SELECT
    c1, c2, c3, c4, c5, row_number AS n
FROM
    (
        SELECT
            @curRow := @curRow + 1 AS row_number
        FROM
            tablea
        JOIN (SELECT @curRow := 0) r
        WHERE
            @curRow < (
                SELECT
                    max(field1)
                FROM
                    tablea
            )
    ) AS vwtable2
LEFT JOIN tablea d ON vwtable2.row_number <= tablea.field1;
于 2015-10-21T20:19:31.567 回答
0

不,没有。但是您可以在程序端而不是数据库端生成序列号。

于 2012-06-19T04:43:03.267 回答
0

你为什么不让它成为一个自动增量字段?

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

于 2012-06-19T04:44:37.267 回答
0

上述答案似乎都不令人满意,因为您需要在单独的查询中将变量初始化为 null。

因此,发布以下所有包罗万象的解决方案:

SELECT ROUND(@a:=@a+1,0) sr_num, t.* from (select @a:=0) initvars, your_table t;
于 2020-04-15T02:51:22.137 回答
0

在 mysql 5.6 中测试:

SELECT
    @a:=@a+1 as serial_number,
    student.* 
FROM
    student
join (SELECT @a:= 0) a
于 2020-08-25T07:08:27.460 回答
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     |
   |...............................|
于 2021-02-24T10:28:13.450 回答
0

@a:=@a+1 序列号,

交叉连接(选择 @a:= 0)作为

SELECT @a:=@a+1 serial_no, sc.id, sc.name, sc.address, c.country,s.state 
FROM oc_table1 sc CROSS JOIN (SELECT @a:= 0) AS a LEFT JOIN oc_table2 .......
于 2021-10-09T06:43:24.650 回答
-1

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

于 2012-06-19T04:46:32.670 回答
-1

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

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

干杯

于 2015-08-01T13:40:17.470 回答