Подтвердить что ты не робот

Несколько значений в переменной mysql

Следующее работает как ожидалось, когда в переменной хранится одно значение.

SET @a := "20100630";
SELECT * FROM wordbase WHERE verified = @a;

Но это не работает, если в переменной есть несколько значений.

SET @a := "'20100630', '20100701' ";
SELECT * FROM wordbase WHERE verified in (@a);

Нужно ли использовать для этого подготовленные инструкции?

4b9b3361

Ответ 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);

отлично работает для меня