Vấn đề là bạn không thể trộn select
và set
trong một tuyên bố, có chắc chắn sẽ có lỗi cú pháp:
select*from t where 1 and [email protected]=1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[email protected]=1' at line 1
Nếu bạn muốn làm set
trong select
, sử dụng the colon equals cú pháp. Thay đổi này:
select*from t where 1 and [email protected]=1;
thành:
select*,@a:=1 from t where 1;
Đây là cách bạn cập nhật các biến theo từng hàng:
create table t(id int); insert t values(1),(2),(3);
[email protected]=0;
[email protected]:=id from t;
+--------+
| @a:=id |
+--------+
| 1 |
| 2 |
| 3 |
+--------+
Và thậm chí bạn có thể làm concat
:
[email protected]='0';
select @a:=concat(@a,',',id)from t;
+-----------------------+
| @a:=concat(@a,',',id) |
+-----------------------+
| 0,1 |
| 0,1,2 |
| 0,1,2,3 |
+-----------------------+
Hoặc concat
mà không 0
hàng đầu:
[email protected]='';
select @a:=concat(@a,if(@a='','',','),id)from t;
+------------------------------------+
| @a:=concat(@a,if(@a='','',','),id) |
+------------------------------------+
| 1 |
| 1,2 |
| 1,2,3 |
+------------------------------------+
Tuy nhiên, hướng dẫn rõ ràng bang rằng đây là nguy hiểm:
...you should never assign a value to a user variable and read the value within the same statement...
...you might get the results you expect, but this is not guaranteed.
...the order of evaluation for expressions involving user variables is undefined.
này cũng đã được đề cập on Xaprb.
Cuối cùng, nếu bạn đang thực hiện kỳ quặc những thứ như chỉ định các loại giá trị khác nhau cho biến và vv, checkout the manual để đảm bảo bạn hiểu các cơ chế phức tạp.
Có thể là 'by_ids INT ('10 ',' 11 ')' to 'by_ids IN ('10', '11')'? – fedorqui
Tại sao 'VÀ SET @rejects = CONCAT (@rejects, ',', src)' trong mệnh đề 'WHERE'? –
Đó là những gì tôi muốn, tôi muốn concat giá trị của mỗi tìm kiếm src vào biến @rejects. –