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

时间:2019-01-16 14:09:55

标签: mysql sql wordpress

我有多个表,例如jibs3_postsjibs4_postsjibs5_posts ..依此类推。我有什么办法可以使用jibs前缀的通配符在所有这些表之间建立联接?

例如:

SELECT * FROM 'jibs*_posts';

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

P.P.S这是一个WordPress多站点

4 个答案:

答案 0 :(得分:2)

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找到正确的语法,但是我相信逻辑很明确。希望一切都好,请让我知道。

答案 1 :(得分:1)

另一种选择。如果新的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语句来拾取新表,然后安排该表定期运行。 / p>

答案 2 :(得分:0)

这在SQL中是不可能的,但是还有其他方法。

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

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

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

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

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

答案 3 :(得分:0)

您可以这样做

df = df.groupby(subset, as_index=False, sort=False)['Year'].first()
print (df)
    Name  Unit  Level    Year
0    Nik     1     12  2000.0
1   John     2     11  2001.0
2  Stacy     1      8  1999.0

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

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

SHOW TABLES LIKE 'jibs%_posts';