I'm using this code which has an error:
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)
);
What's causing the issue?
To assign a value to a variable, use the SET statement. This is the preferred method of assigning a value to a variable. A variable can also have a value assigned by being referenced in the select list of a SELECT statement.
MySQL variable assignment There are two ways to assign a value to a user-defined variable. You can use either := or = as the assignment operator in the SET statement. For example, the statement assigns number 100 to the variable @counter. The second way to assign a value to a variable is to use the SELECT statement.
You can declare a variable using @anyVariablename which is a session variable. To create a session variable, you need to use SET command.
12 years, 10 months ago. it's for php to know how to handle the parameters, %d – the argument is treated as an integer, and presented as a (signed) decimal number. %s – the argument is treated as and presented as a string. in your examples, $slug is a string and $this->id is an integer.
The issue is that you cannot mix select
and set
in one statement, there'll surely be syntax error:
select*from t where 1 and set@a=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 'set@a=1' at line 1
If you want to do set
within select
, use the colon equals syntax. Change this:
select*from t where 1 and set@a=1;
into:
select*,@a:=1 from t where 1;
Here's how you update the variable upon each row:
create table t(id int); insert t values(1),(2),(3);
set@a=0;
select@a:=id from t;
+--------+ | @a:=id | +--------+ | 1 | | 2 | | 3 | +--------+
And you can even do concat
:
set@a='0';
select @a:=concat(@a,',',id)from t;
+-----------------------+ | @a:=concat(@a,',',id) | +-----------------------+ | 0,1 | | 0,1,2 | | 0,1,2,3 | +-----------------------+
Or concat
without the leading 0
:
set@a='';
select @a:=concat(@a,if(@a='','',','),id)from t;
+------------------------------------+ | @a:=concat(@a,if(@a='','',','),id) | +------------------------------------+ | 1 | | 1,2 | | 1,2,3 | +------------------------------------+
However, the manual explicitly states that this is dangerous:
...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.
This has also been mentioned on Xaprb.
Lastly, if you're doing quirky things like assigning differing value types to the variable and etc, checkout the manual to be sure you understand the intricate mechanisms.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With