Как ВЫБРАТЬ из нескольких таблиц в MySQL?

У меня много таблиц с одинаковыми окончаниями _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? Заранее спасибо!

Исправьте структуру данных! Не храните отдельную таблицу для каждого домена. Включите домен как столбец в единую таблицу.

Gordon Linoff 30.12.2018 15:20

Если есть вероятность, что значения из массива ids могут поступать извне нестерилизованными, тогда вы захотите использовать подготовленный оператор для построения вашего запроса.

Tim Biegeleisen 30.12.2018 15:22

Пожалуйста, взгляните на мой опубликованный ответ, отметьте его как принятый, если он решит вашу проблему.

Tarreq 30.12.2018 16:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это с помощью динамических запросов и регулярных выражений:

Этот динамический запрос делает то, что вы хотите:

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;

Попробую в ближайшее время, когда доберусь до своего компьютера. Спасибо!

Nastro 30.12.2018 18:02

Да, это работает! но не могли бы вы объяснить, откуда берется TABLE_NAME? А что такое INTO и @sql?

Nastro 30.12.2018 19:29

TABLE_NAME - это переменная-заполнитель, которая получает свое значение из INFORMATION_SCHEMA.TABLES, которая содержит все имена таблиц в вашей БД, поэтому, когда вы запускаете ее, она заменяет его фактическим именем таблицы, помещая предложение where, определяющее регулярное выражение «REGEXP '_ips $ ', что означает получение всех таблиц из списка таблиц, который заканчивается на' _ips '. @sql также является переменной, в которую select помещает свой результат, поэтому он содержит вашу окончательную строку запроса.

Tarreq 30.12.2018 19:40

Другие вопросы по теме