Я знаю, что это старый пост, но я думал, что внесет вклад, поскольку мне нужно было выполнить это упражнение самостоятельно, и это дало мне некоторые идеи.
Вот решение, к которому я пришел, оговорка здесь что значения в списке с разделителями-запятыми были определены однозначно в другой таблице:
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)
Вы можете сделать что-то вроде этого
SHOW TABLES LIKE 'jibs%_posts';
, здесь будут перечислены все таблицы с этой схемой именования.
Затем вы можете объединить все таблицы (если они имеют одинаковое количество столбцов) с помощью UNION
SELECT * FROM jibs_posts
UNION
// ... more SELECTS
UNION
SELECT * FROM jibsX_posts;
Это невозможно с SQL, но есть альтернативные подходы.
Если есть веская причина отказаться от нескольких таблиц (то есть, если модель данных будет удовлетворена одной общей таблицей), вы можете выполнить однократное преобразование нескольких таблиц в одну таблицу. [112 ]
Если есть веская причина для сохранения нескольких таблиц (то есть, если что-то связано с вашей моделью данных или какими-то материально-техническими ограничениями, которые диктуют такое расположение), то это хорошая ситуация для объединения инструментов. В частности, вы можете использовать ваш любимый язык программирования или язык сценариев для генерации SQL, который ссылается на все таблицы, а затем использовать этот сгенерированный SQL.
Многие языки программирования позволят вам генерировать SQL и использовать его в одной и той же программе через привязки базы данных.
РЕДАКТИРОВАТЬ : я вижу, что вы добавили тег wordpress
(я начал составлять свой ответ до того, как он был там), поэтому я не уверен, насколько применим мой ответ. То есть я не уверен, сколько у вас прав доступа, чтобы напрямую взаимодействовать с базой данных. Если вы ограничены тем, что требует Wordpress, и / или тем, как Wordpress позволяет вам запускать SQL, который вы хотите запустить, тогда мой общий ответ MySQL / SQL может не сильно помочь.
Тем не менее, моим общим советом было бы подойти к проблеме со всеми инструментами, имеющимися в вашем наборе инструментов, и рассмотреть подход сочетания сил, поскольку SQL не поддерживает подстановочные знаки для имен таблиц.
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, но логика ясна, я верю. Надеюсь, что все хорошо, пожалуйста, дайте мне знать.
Еще одна альтернатива. Если новые таблицы 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
для выбора новых таблиц, а затем запланировать его периодическую работу.