私は、MySQL での変数宣言を含むクエリにかなり慣れていません。さまざまなスタイルを見てきましたが、これらが実際に何をするのか完全にはわかりません。これらが実際に何をするのかについて質問があります。
1)
set @row:=0;
SELECT name, @row:=@row + 1 AS rownum
FROM animal
2)
SELECT name, @row:=@row + 1 AS rownum
FROM (SELECT @row:= 0) c, animal
どちらも同じものを返します:
name rownum
|| cat || 1 ||
|| cat || 2 ||
|| dog || 3 ||
|| dog || 4 ||
|| dog || 5 ||
|| ant || 6 ||
上記の 2 つのクエリの違いと、その範囲、効率、コーディングの習慣、ユースケースに関して、どちらを採用すべきか?
3)今、私がこれを行うと:
set @row:=0;
SELECT name, @row:=@row + 1 AS rownum
FROM (SELECT @row:= 123) c, animal
私は得る
name rownum
|| cat || 124 ||
|| cat || 125 ||
|| dog || 126 ||
|| dog || 127 ||
|| dog || 128 ||
|| ant || 129 ||
したがって、内部変数の初期化が外部初期化をオーバーライドし、後者を冗長のままにしているという意味ではありません(したがって、常にSELECT
?
4)私が単に行う場合:
SELECT name, @row:=@row + 1 AS rownum
FROM animal
私は得る
name rownum
|| cat || NULL ||
|| cat || NULL ||
|| dog || NULL ||
|| dog || NULL ||
|| dog || NULL ||
|| ant || NULL ||
初期化されていないので理解できrow
ます。しかし、他のクエリを実行すると (変数row
が初期化されている可能性がありますか?) row
、上記のクエリを実行するたびに変数がインクリメントされていることがわかります。つまり、最初の実行で結果が得られます。
name rownum
|| cat || 1 ||
|| cat || 2 ||
|| dog || 3 ||
|| dog || 4 ||
|| dog || 5 ||
|| ant || 6 ||
そして、再実行すると、
name rownum
|| cat || 7 ||
|| cat || 8 ||
|| dog || 9 ||
|| dog || 10 ||
|| dog || 11 ||
|| ant || 12 ||
それでrow
、どこかに保管されていますか?そして、その範囲と寿命は?
5) 次のようなクエリがある場合:
SELECT (CASE WHEN @name <> name THEN @row:=1 ELSE @row:=@row + 1 END) AS rownum,
@name:=name AS name
FROM animal
これにより、常に正しい結果が得られます。
rownum name
|| 1 || cat ||
|| 2 || cat ||
|| 1 || dog ||
|| 2 || dog ||
|| 3 || dog ||
|| 1 || ant ||
SELECT
つまり、変数を先頭またはクエリに応じて初期化する必要があるとは限らないということではないでしょうか?