mysql:14868
From: 柴垣 <柴垣 <akiro@xxxxxxxxxx>>
Date: Fri, 22 May 2009 00:44:00 +0900
Subject: [mysql 14868] @変数の動作について
柴垣といいます。 @変数を使ったsql文の動作について、気づいたことを書きます。 例えば、下のようなテーブル T があって +------+ | code | +------+ | a | | b | | a | | c | | b | | a | | c | +------+ select if(T.code=@code,'same','new') as Mark,@code:=T.code as Code from T order by T.code; としてソートすると、下のような結果が返ってきます。 +------+------+ | Mark | Code | +------+------+ | new | a | | same | a | | same | a | | new | b | | same | b | | new | c | | same | c | +------+------+ ここまでは期待通りです。 ところが、下のような別のテーブル M を用意して、 +------+------+ | code | name | +------+------+ | a | ASM | | b | BAS | | c | COM | +------+------+ select if(T.code=@code,'same','new') as Mark,@code:=T.code as Code, M.name from T left join M on T.code=M.code order by T.code; のようにnameフィールドを付け加えて出力しようとすると、 +------+------+------+ | Mark | Code | name | +------+------+------+ | new | a | ASM | | new | a | ASM | | new | a | ASM | | new | b | BAS | | new | b | BAS | | new | c | COM | | new | c | COM | +------+------+------+ となってしまいます。 「from」の部分を、fromT,M と書いてみたりすることから始めて 多くの行からこのデータセットが抽出されていく過程を追うことで @code の挙動は一応理解したのですが、出力を +------+------+------+ | Mark | Code | name | +------+------+------+ | new | a | ASM | | same | a | ASM | | same | a | ASM | | new | b | BAS | | same | b | BAS | | new | c | COM | | same | c | COM | +------+------+------+ とする工夫はないものでしょうか。 (あまり一般性がないかもしれない内容で、申し訳ありません。) _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 柴垣 akiro@xxxxxxxxxx _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
-> 14868 2009-05-22 00:44 [柴垣 <akiro@xxxxxxxx] @変数の動作について 14869 2009-05-22 01:44 ┗["N.K." <nakai.kanako] 14870 2009-05-22 09:16 ┗[柴垣 <akiro@xxxxxxxx] 14871 2009-05-22 09:50 ┗["N.K." <nakai.kanako] 14872 2009-05-22 12:06 ┗[柴垣 <akiro@xxxxxxxx]