select
問題は、混在させることができずset
、1 つのステートメントで構文エラーが確実に発生することです。
select*from t where 1 and set@a=1;
エラー 1064 (42000): SQL 構文にエラーがあります。1行目の「set@a=1」付近で使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください
set
内で実行する場合は、コロンと等号の構文select
を使用します。これを変える:
select*from t where 1 and set@a=1;
の中へ:
select*,@a:=1 from t where 1;
各行で変数を更新する方法は次のとおりです。
create table t(id int); insert t values(1),(2),(3);
set@a=0;
select@a:=id from t;
+--------+
| @a:=id |
+--------+
| 1 |
| 2 |
| 3 |
+--------+
そして、あなたもできるconcat
:
set@a='0';
select @a:=concat(@a,',',id)from t;
+-----------------------+
| @a:=concat(@a,',',id) |
+-----------------------+
| 0,1 |
| 0,1,2 |
| 0,1,2,3 |
+-----------------------+
またはconcat
先頭なし0
:
set@a='';
select @a:=concat(@a,if(@a='','',','),id)from t;
+------------------------------------+
| @a:=concat(@a,if(@a='','',','),id) |
+------------------------------------+
| 1 |
| 1,2 |
| 1,2,3 |
+------------------------------------+
ただし、マニュアルには、これは危険であると明示的に記載されています。
...ユーザー変数に値を割り当てて、同じステートメント内で値を読み取らないでください...
...期待どおりの結果が得られる可能性がありますが、これは保証されません。
...ユーザー変数を含む式の評価順序は
未定義です。
これはXaprbでも言及されています。
最後に、変数に異なる値の型を割り当てるなどの風変わりなことをしている場合は、マニュアルをチェックアウトして、複雑なメカニズムを理解していることを確認してください。