MySQLには、Oracleや他のDBMSが提供するようなdense_rank()
やrow_number()
のような関数はありますか?
クエリ内で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
クエリを使用して同じ機能を作成できます。
これは同じことをしている記事です:
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;