MySQL中是否有类似dense_rank()
和row_number()
的功能,类似于Oracle和其他DBMS提供的功能?
我想在查询中生成一个id,但在MySQL中没有这些函数。有其他选择吗?
Mysql没有它们,但您可以使用以下表达式模拟row_number()
,该表达式使用用户定义的变量:
(@row := ifnull(@row, 0) + 1)
像这样:
select *, (@row := ifnull(@row, 0) + 1) row_number
from mytable
order by id
但是如果您重用会话,@row
仍将被设置,因此您需要像这样重置它:
set @row := 0;
select *, (@row := @row + 1) row_number
from mytable
order by 1;
请参见SQLFiddle。
dense_rank()
是可能的,但火车失事;我建议在应用层中处理该要求。
我们现在有。。
select ename, sal, dense_rank() over (order by sal desc)rnk
from emp2 e
order by rnk;
在MySql
中,您没有像Oracle
中那样的dense_rank()
或row_number()
。
但您可以通过SQL
查询创建相同的功能:
这是一篇做同样的文章:
dense_rank()
row_number()
MySQL不支持这些功能,但您可以自己模仿它们。可耻地链接到我在MySQL 中的ROW_NUMBER、RANK和DENSE_RANK函数的解决方案
DENSE_RANK()
函数在MySQL 8.0版本中可用。因此,如果你使用的是MySQL 8.0版本,你可以运行这个命令,
SELECT name, DENSE_RANK() OVER ( ORDER BY value ) my_rank FROM table_name;
MySQL版本8现在有ROW_NUMBER。文档
示例:
SELECT
ROW_NUMBER() OVER (ORDER BY s.Id) AS 'row_num',
s.product,
s.title
FROM supplies AS S