2013-03-22 72 views
6

Tôi đang sử dụng mã này trong đó có một lỗi:SET một biến trong câu lệnh SELECT - MySQL

SET @rejects = ''; 

SELECT * 
FROM list 
WHERE maker = 1 
    AND by_ids IN ('10','11') 
    AND country LIKE '%I%' 
    AND (
     src IS NULL 
     || src NOT IN (@rejects) 
     AND checkSrc(src) = 'yes' 
     AND SET @rejects = CONCAT(@rejects,',',src) 
    ); 

gì gây ra vấn đề?

+0

Có thể là 'by_ids INT ('10 ',' 11 ')' to 'by_ids IN ('10', '11')'? – fedorqui

+0

Tại sao 'VÀ SET @rejects = CONCAT (@rejects, ',', src)' trong mệnh đề 'WHERE'? –

+0

Đó 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. –

Trả lời

2

Sau đó, bạn có thể viết truy vấn của mình như thế này.

SET @rejects = ''; 
SELECT @rejects = CONCAT(@rejects,',',src) FROM list WHERE maker = 1 AND by_ids IN ('10','11') AND country LIKE '%I%' AND 
(src IS NULL OR src NOT IN (@rejects) AND checkSrc(src) = 'yes'); 
SELECT @rejects; 
+1

Xin lỗi, nhưng không hoạt động theo cách cần –

+0

Sản lượng mong đợi của bạn là bao nhiêu? Ngoài ra nếu src là null thì có thể có một vấn đề. Bạn có thể đăng cấu trúc bảng của bạn và đầu ra dự kiến? –

5

Vấn đề là bạn không thể trộn selectset 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: link

...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ác vấn đề liên quan