Используйте пользовательскую переменную для динамического присвоения имени второй базе данных для СОЕДИНЕНИЯ таблиц с этой второй базой данных.
Мне нужно JOIN
две разные базы данных, которые я уже создал статически только для целей тестирования.
- Первая база данных уже определена в самом соединении.
- Вторая база данных должна быть динамически получена из информации в первой базе данных, которая сначала должна быть определена в пользовательской переменной. Для простоты я просто назову второе имя базы данных как
example2
. - Статическое определение второго имени базы данных работает, и все
JOIN
ed данные успешно извлекаются, однако, с моим текущим пониманием, если бы я сделал это на живом (или "производственном") сервере, мне пришлось бы выполнять два отдельных запроса на одном и том же соединении с некоторым кодом PHP между этими двумя запросами. - Я не могу определить второе имя базы данных без выполнения второго запроса, и цель состоит в том, чтобы избежать множественных подключений к серверу SQL, когда я знаю, что есть способ сделать это в одном запросе (если мы не учитываем установку пользователя - определил переменную запрос).
Вот статическая демонстрация того, что у меня сработало:
SELECT * FROM example1 AS e1
INNER JOIN example2.accounts AS e2a ON (e2a.id = e1.accounts_id);
Однако следующее не работает:
SET @db = 'example2';
SELECT * FROM example1 AS e1
INNER JOIN @db.accounts AS e2a ON (e2a.id = e1.accounts_id);
Как я могу установить и использовать определяемую пользователем переменную для динамического определения имени второй базы данных и использовать его для динамическогоJOIN
таблицы между двумя базами данных?
- Все данные правильно хранятся / форматируются / и т. Д.
- У меня уже есть рабочая переменная, определяемая пользователем, мне нужна помощь в ее реализации при соединении базы данных с базой данных.
- Это связано с тем, что PHP имеет переменные переменные.
2 ответа
Решение
В MySQL вы можете использовать подготовленные операторы, например
SET @db = 'example2';
SET @sql = CONCAT('SELECT * FROM example1 AS e1
INNER JOIN ', @db ,
'.accounts AS e2a ON e2a.id = e1.accounts_id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Чтобы избежать ненужных поездок между клиентом и сервером в 1-м ответе, вот 2 лайнера:
SET @db = 'example2';
EXECUTE IMMEDIATE CONCAT('SELECT * FROM example1 AS e1 INNER JOIN ', @db , '.accounts AS e2a ON e2a.id = e1.accounts_id');