Несколько значений в переменной mysql
Следующее работает как ожидалось, когда в переменной хранится одно значение.
SET @a := "20100630";
SELECT * FROM wordbase WHERE verified = @a;
Но это не работает, если в переменной есть несколько значений.
SET @a := "'20100630', '20100701' ";
SELECT * FROM wordbase WHERE verified in (@a);
Нужно ли использовать для этого подготовленные инструкции?
Ответы
Ответ 1
Вы не можете (насколько мне известно) хранить несколько значений в пользовательской переменной MySQL. Вы создали строку, содержащую:
'20100630', '20100701'
Это не два отдельных значения, а одно строковое значение, так же как это однострочное значение:
SET @a := "It a single string, and that the problem";
Вам нужно использовать две отдельные переменные или подготовить инструкцию, например:
SET @a := "20100630";
SET @b := "20100701";
SET @sql = CONCAT(
'SELECT * FROM wordbase WHERE verified IN (',
@a,
',',
@b,
')'
);
SELECT @sql;
+--------------------------------------------------------------+
| @sql |
+--------------------------------------------------------------+
| SELECT * FROM wordbase WHERE verified IN (20100630,20100701) |
+--------------------------------------------------------------+
PREPARE stmt FROM @sql;
EXECUTE stmt;
Но что-то грязное. Зачем вам нужны переменные?
Ответ 2
Здесь есть хорошее решение: fooobar.com/questions/116895/...
Так можно использовать что-то вроде этого:
SET @a := '20100630,20100701';
SELECT * FROM wordbase WHERE FIND_IN_SET(verified, @a);
Кроме того, если вы выбираете идентификаторы для @a
из другой таблицы, вы можете найти следующее:
SET @a := (SELECT GROUP_CONCAT(id) FROM someTable where yourBooleanExpressionHere);
SELECT * FROM wordbase WHERE FIND_IN_SET(verified, @a);
Ответ 3
Используя GROUP_CONCAT
и GROUP BY
, можно вывести все значения (например, id) в переменную следующим образом:
SET @var := (SELECT GROUP_CONCAT(id) FROM `table` WHERE `verified` = @verified GROUP BY verified);
Ответ 4
Что-то вроде этого должно работать. Можно ли использовать подготовленные операторы для создания временных таблиц, подобных этому?
SET @a := "'20100630', '20100701'";
SET @sql = CONCAT('create temporary table pn1 SELECT * FROM wordbase WHERE verified IN (', @a, ')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
select * from pn1;
Ответ 5
SELECT GROUP_CONCAT(field_table1 SEPARATOR ',') FROM table1 into @var;
затем
SELECT * FROM table2 WHERE field_table2 in(@var);
отлично работает для меня