SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.06.2020 23:08:58

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Переменная в запросе с IN

Подскажите, пожалуйста. Почему запрос

SET @groups = '1,9';
SELECT * FROM `tarif` WHERE `group` IN (@groups)


Работает как запрос

SELECT * FROM `tarif` WHERE `group` IN (1)


а не как

SELECT * FROM `tarif` WHERE `group` IN (1,9)


И как это исправить.


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#2 14.06.2020 14:28:49

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Переменная в запросе с IN

Неужто никто не знает?


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#3 14.06.2020 23:21:28

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Переменная в запросе с IN

Вы передаете в запрос строку, а не набор значений.
Ваш запрос эквивалентен

SELECT * FROM `tarif` WHERE `group` IN ('1,9')
а не
SELECT * FROM `tarif` WHERE `group` IN (1,9)


если формируете запрос в mysql, то используйте prepare
SET @groups = '1,9';
set @query = concat('SELECT * FROM `tarif` WHERE `id` IN (',@groups,')');
prepare zxc from @query;
execute zxc;

Неактивен

 

#4 14.06.2020 23:59:40

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Переменная в запросе с IN

Да дело в том, что я уже использую Prepare и хочу передать в него значение.

mysqli_query($LINKMYSQL, "PREPARE select_tarif_in FROM  'SELECT * FROM `tarif` WHERE `group` IN (?)' ");
mysqli_query($LINKMYSQL, "SET @groups := '".mysqli_real_escape_string($LINKMYSQL,trim((string)$_COOKIE['gropus']))."'");
mysqli_query($LINKMYSQL, "EXECUTE select_tarif_in using @groups");


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#5 15.06.2020 00:00:12

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Переменная в запросе с IN

Как-то передать набор значений я в переменную не могу?


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#6 15.06.2020 00:14:58

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Переменная в запросе с IN

нет, не можете

Неактивен

 

#7 15.06.2020 13:42:49

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Переменная в запросе с IN

А почему Вы не хотите добавить эти параметры сразу в PHP, а делаете это через переменную в MySQL? Ведь данные всё равно в переменную из PHP берутся?

Неактивен

 

#8 16.06.2020 23:06:02

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Переменная в запросе с IN

Переменная в MySQL не может быть типа "массив", отсюда и невозможность подставить список значений в prepared statement.
Так что увы.

Я для таких случаев написал библиотеку-расширение для работы с MySQL.

С её помощью можно делать вот так:


$ids = [ 1, 9 ];
$data = mysql_gettable("SELECT * FROM tarif WHERE group IN (" . mysql_escape($ids) . ")");
 

или так:

$query = [
   'groups' => [ 1, 9 ]
];
$data = mysql_gettable(
   "SELECT * FROM tarif WHERE group IN ( :groups )",
   FALSE,
   $query // массив для подстановки в запрос
);
 

При подстановке массива в запрос вместо меток типа :name библиотека автоматически проведет экранирование.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson