Объедините все таблицы с префиксами в одну

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

Вот решение, к которому я пришел, оговорка здесь что значения в списке с разделителями-запятыми были определены однозначно в другой таблице:

create table `defined_values` (
  id int(11) not null auto_increment primary key,
  label varchar(12) not null,
  constraint `defined_values_uidx` unique (`label`)
) engine = innodb charset utf8;

create table `delimited_string` (
  id int(11) not null auto_increment primary key,
  `str_delim` varchar(32) not null
) engine = innodb charset utf8;

insert into `defined_values` (`label`) values
('YVR'),
('YEG'),
('YXJ'),
('YYC'),
('YMM')
;

insert into `delimited_string` (`str_delim`) values 
('YVR,YEG,YXJ,YYC,YMM')
;

select 
  v.`label` as `normalized` 
from 
  `delimited_string` s
  join `defined_values` v on (v.`label` = substring(s.`str_delim`, position(v.`label` in s.`str_delim`), length(v.`label`))) 

;

// Урождения:

+------------+
| normalized | 
+------------+
| YEG        |
| YMM        |
| YVR        |
| YXJ        |
| YYC        |
+------------+

5 строк в set (0.00 sec)

1
задан RiggsFolly 16 January 2019 в 14:15
поделиться

4 ответа

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

SHOW TABLES LIKE 'jibs%_posts';

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

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

SELECT * FROM jibs_posts
UNION
// ... more SELECTS
UNION
SELECT * FROM jibsX_posts;
0
ответ дан yunzen 16 January 2019 в 14:15
поделиться

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

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

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

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

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

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

0
ответ дан landru27 16 January 2019 в 14:15
поделиться

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
ответ дан Eray Balkanli 16 January 2019 в 14:15
поделиться

Еще одна альтернатива. Если новые таблицы 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
ответ дан Eric Brandt 16 January 2019 в 14:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: