繁体   English   中英

将所有带前缀的表合并为一个

[英]Join all prefixed tables into one

我有多个表,即jibs3_postsjibs4_postsjibs5_posts ..等等。 我有什么办法可以在所有这些表之间加入某种形式的jibs -prefix通配符?

例如:

SELECT * FROM 'jibs*_posts';

抱歉,如果这是重复的,但找不到任何解决方案。

PPS这是一个WordPress多站点

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即可。

当然,如果它们经常弹出,那么维护起来将很麻烦。

编辑 :如果想花哨,可以使用Eray Balkanli的动态SQL生成ALTER VIEW语句以拾取新表,然后安排其定期运行。

对于SQL,这是不可能的,但是有替代方法。

如果有充分的理由放弃多个表(即,如果一个通用表满足数据模型),则可以将多个表一次性转换为单个表。

如果有充分的理由保留多个表(即,如果您的数据模型中存在某些问题,或者某些后勤约束决定了这种安排),那么这是组合工具的良好情况。 具体来说,您可以使用自己喜欢的编程语言或脚本语言来生成引用所有表的SQL,然后采用该生成的SQL。

许多编程语言都允许您通过数据库绑定生成SQL并在同一程序中使用它。

编辑 :我看到您已经添加了wordpress标记(我开始在那里之前编写答案),所以我不确定我的答案适用多少。 也就是说,我不确定直接与数据库进行交互需要多少访问权限。 如果您受Wordpress的要求和/或Wordpress允许您运行要运行的SQL的方式的约束,那么我的通用MySQL / SQL回答可能没有太大帮助。

不过,我的一般建议是使用工具箱中的所有工具来解决该问题,并考虑采用强度组合的方法,因为SQL不支持表名的通配符。

你可以做这样的事情

SHOW TABLES LIKE 'jibs%_posts';

这将列出具有该命名方案的所有表。

然后,您可以使用UNION连接所有表(如果它们具有相同的列数)

SELECT * FROM jibs_posts
UNION
// ... more SELECTS
UNION
SELECT * FROM jibsX_posts;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM