Объедините все таблицы с префиксами в одну - PullRequest
0 голосов
/ 16 января 2019

У меня есть несколько таблиц, т.е. jibs3_posts, jibs4_posts, jibs5_posts .. и так далее. Можно ли как-нибудь объединить все эти таблицы с каким-то подстановочным знаком для jibs -prefix?

Например:

SELECT * FROM 'jibs*_posts';

P.S. Извините, если это дубликат, но не удалось найти решение.

P.P.S Это WordPress Multisite

Ответы [ 4 ]

0 голосов
/ 16 января 2019

Еще одна альтернатива.Если новые jibs таблицы добавляются не слишком часто, вы можете создать представление, которое UNION объединит их все вместе, а затем написать свои запросы к представлению.Таким образом, вам нужно будет выполнять утомительную печать только один раз.

Если память работает (прошло много времени с тех пор, как я играл на сайте Wordpress), вы сможете добавить необходимый объект в базу данных.

Что-то с эффектом:

CREATE VIEW v_jibs_posts AS
  SELECT <column_list> FROM jibs1_posts
  UNION
  ...<SELECTS from all the tables>
  UNION
  SELECT <column_list> FROM jibs<n>_posts

Затем просто добавьте дополнительный UNION к представлению, когда приложение создает новые таблицы.

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

Редактировать : Если вы хотите получить фантазию, вы можете использовать динамический SQL Eray Balkanli для генерации оператора ALTER VIEWподобрать новые таблицы, а затем запланировать их периодическую работу.

0 голосов
/ 16 января 2019

Вы могли бы сделать что-то вроде этого

SHOW TABLES LIKE 'jibs%_posts';

здесь будут перечислены все таблицы с такой схемой именования.

Затем вы можете объединить все таблицы (если они имеют одинаковое количество столбцов) с помощью UNION

SELECT * FROM jibs_posts
UNION
// ... more SELECTS
UNION
SELECT * FROM jibsX_posts;
0 голосов
/ 16 января 2019

1- Получите имена ваших столов:

declare @row_number int = 0;

CREATE TEMPORARY TABLE JibsTables (table_name varchar(50), num int)

INSERT INTO JibsTables (table_name, num)
SELECT table_name, (@row_number:=@row_number + 1) AS num
FROM information_schema.tables 
WHERE table_schema='your_database_name'
  AND table_name like 'jibs%'

2 - Создать динамический запрос в цикле.

declare @counter = 1
declare @sql nvarchar(max);
declare @temptable nvarchar(100);
declare @limit int = (select count(*) from JibsTables)

while @counter <= @limit
begin
   set @temptable = select table_name from JibsTables where num = @counter

   if @counter <> @limit
   begin
      set @sql = @sql + ' select * from ' + @temptable + ' union'
   end
   else
   begin
      set @sql = @sql + ' select * from ' + @temptable + ';'
   end

   set @counter = @counter + 1
end

3- Выполнить динамический запрос

PREPARE stmt1 FROM @sql
EXECUTE stmt1
DEALLOCATE PREPARE stmt1;

Я знаком с синтаксисом MSSQL, старался изо всех сил найти правильный синтаксис для mysql, но логика ясна, я верю. Надеюсь, что все хорошо, пожалуйста, дайте мне знать.

0 голосов
/ 16 января 2019

Это невозможно с SQL, но существуют альтернативные подходы.

Если есть веская причина отказаться от нескольких таблиц (т. Е. Если модель данных будет удовлетворена одной общей таблицей), вы можете выполнить однократное преобразование нескольких таблиц в одну таблицу.

Если есть веская причина для сохранения нескольких таблиц (то есть, если что-то связано с вашей моделью данных или какими-то логистическими ограничениями, которые диктуют такое расположение), то это хорошая ситуация для объединения инструментов. В частности, вы можете использовать ваш любимый язык программирования или язык сценариев для генерации SQL, который ссылается на все таблицы, а затем использовать этот сгенерированный SQL.

Многие языки программирования позволят вам генерировать SQL и использовать его в одной и той же программе через привязки базы данных.

EDIT : я вижу, что вы добавили тег wordpress (я начал составлять свой ответ до того, как он там был), поэтому я не уверен, насколько применим мой ответ. То есть я не уверен, сколько у вас доступа, чтобы напрямую взаимодействовать с базой данных. Если вы ограничены тем, что требует Wordpress, и / или каким образом Wordpress позволяет вам запускать SQL, который вы хотите запустить, тогда мой общий ответ на MySQL / SQL может не сильно помочь.

Тем не менее, мой общий совет - подойти к проблеме со всеми инструментами, имеющимися в вашем наборе инструментов, и рассмотреть подход с комбинацией сил, поскольку SQL не поддерживает подстановочные знаки для имен таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...