我有一张桌子: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中实现这一点而不使用用户定义的变量?
答案 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)
答案 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;
干杯