Как выбрать из MySQL, где имя таблицы является переменной

У меня есть случай, когда имя таблицы должно быть получено из заданной переменной, например:

SET @ID_1 = (SELECT ID FROM `slider` LIMIT 0,1);
SET @Cat = (SELECT Category FROM `slider` LIMIT 0,1);
select * from @Cat where ID = @ID_1

но при этом MySQL выводит ошибку, поэтому может ли кто-нибудь показать мне, как я могу этого добиться, потому что это мои детские шаги в MySQL.


person Rosmarine Popcorn    schedule 10.01.2012    source источник


Ответы (2)


Вам нужно будет сделать это с помощью подготовленного оператора . Что-то вроде:

SET @s = CONCAT('select * from ', @Cat, ' where ID = ', @ID_1); 

PREPARE stmt1 FROM @s; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 
person Joe Stefanelli    schedule 10.01.2012
comment
Еще одна вещь, которую он показывает, только когда я удаляю DEALLOCATE PREPARE stm1; - person Rosmarine Popcorn; 11.01.2012
comment
Блестящее решение. Помогли решить мою проблему, спасибо. - person Tim Visée; 26.05.2016
comment
Что делает DEALLOCATE PREPARE? - person Frozen Flame; 29.06.2016
comment
это все еще действующий синтаксис в 2018 году ?? - person oldboy; 17.07.2018
comment
Я так думаю... Не забывайте, это работает только для процедур, а не для функций. - person Agamemnus; 22.10.2018
comment
Я знаю, что это старый ответ, но есть одна большая проблема, заключающаяся в том, что он открывает вас для SQL-инъекций. Синтаксис EXECUTE <> USING <> безопасен для SQL-инъекций. Итак, вам нужно сначала выполнить PREPARE table_exists FROM 'SELECT TABLE_NAME FROM information_schema.TABLE WHERE TABLE_NAME = ?'; EXECUTE table_exists USING @Cat, чтобы проверить и использовать его для проверки, если в @Cat нет вектора SQL-инъекций - person Raymond Nijland; 13.12.2018
comment
Что, если мне также нужно сохранить результат в переменной? SELECT x INTO @x FROM @y.... Возможно ли с помощью CONCAT? - person Tal Kohavy; 01.04.2021

Я получил это решение после нескольких часов отладки

Изображение, которое я прикрепил, работает на 100% для mysql.

person Palak Mantry    schedule 06.04.2020
comment
Добро пожаловать в stackoverflow.com. Пожалуйста, размещайте код в виде текста, а не изображений. См. Как ответить - person Simon.S.A.; 06.04.2020