У меня много таблиц с одинаковыми окончаниями _ips. Пример:
first-domain.com_ips
secons-domain.com_ips
...
Я пытаюсь получить таблицу результатов UNION, которая будет содержать все строки из всех таблиц _ips. Для этого я использую:
SELECT id, expirationDate FROM `first-domain.com_ips` WHERE isBlocked = 1
UNION
SELECT id, expirationDate FROM `secons-domain.com_ips` WHERE isBlocked = 1
...;
У меня есть массив, состоящий из доменных имен. Итак, я ищу способ использовать этот массив домена в запросе SQL. Может быть, что-то вроде того, что мы используем с SELECT. Пример:
const ids = [3, 4, 6, 8];
const query = 'SELECT * FROM table WHERE id IN (' + ids.join() + ')';
Есть ли способ использовать массив для имен таблиц в SQL? Заранее спасибо!
Если есть вероятность, что значения из массива ids могут поступать извне нестерилизованными, тогда вы захотите использовать подготовленный оператор для построения вашего запроса.
Пожалуйста, взгляните на мой опубликованный ответ, отметьте его как принятый, если он решит вашу проблему.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете сделать это с помощью динамических запросов и регулярных выражений:
Этот динамический запрос делает то, что вы хотите:
SELECT
GROUP_CONCAT(
CONCAT(
'SELECT * FROM `',
TABLE_NAME,
'`') SEPARATOR ' UNION ALL ')
FROM
`INFORMATION_SCHEMA`.`TABLES`
WHERE
`TABLE_NAME` REGEXP '_ips$'
INTO @sql;
SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
Этот запрос дает два вывода, первый - это последняя строка запроса SQL, которая выглядит так:
SELECT * FROM `first-domain.com_ips` UNION ALL SELECT * FROM `second-domain.com_ips`
а другой вывод - это фактические данные из всех таблиц, если вам нужны только окончательные данные, вы можете удалить этот оператор:
SELECT @sql;
Попробую в ближайшее время, когда доберусь до своего компьютера. Спасибо!
Да, это работает! но не могли бы вы объяснить, откуда берется TABLE_NAME? А что такое INTO и @sql?
TABLE_NAME - это переменная-заполнитель, которая получает свое значение из INFORMATION_SCHEMA.TABLES, которая содержит все имена таблиц в вашей БД, поэтому, когда вы запускаете ее, она заменяет его фактическим именем таблицы, помещая предложение where, определяющее регулярное выражение «REGEXP '_ips $ ', что означает получение всех таблиц из списка таблиц, который заканчивается на' _ips '. @sql также является переменной, в которую select помещает свой результат, поэтому он содержит вашу окончательную строку запроса.
Исправьте структуру данных! Не храните отдельную таблицу для каждого домена. Включите домен как столбец в единую таблицу.