Используйте пользовательскую переменную для динамического присвоения имени второй базе данных для СОЕДИНЕНИЯ таблиц с этой второй базой данных.

Мне нужно JOINдве разные базы данных, которые я уже создал статически только для целей тестирования.

  1. Первая база данных уже определена в самом соединении.
  2. Вторая база данных должна быть динамически получена из информации в первой базе данных, которая сначала должна быть определена в пользовательской переменной. Для простоты я просто назову второе имя базы данных какexample2.
  3. Статическое определение второго имени базы данных работает, и все JOINed данные успешно извлекаются, однако, с моим текущим пониманием, если бы я сделал это на живом (или "производственном") сервере, мне пришлось бы выполнять два отдельных запроса на одном и том же соединении с некоторым кодом PHP между этими двумя запросами.
  4. Я не могу определить второе имя базы данных без выполнения второго запроса, и цель состоит в том, чтобы избежать множественных подключений к серверу 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');
Другие вопросы по тегам