2009年5月22日

[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@xxxxx

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/


投稿者 xml-rpc : 2009年5月22日 00:44
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/85258
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。