[英]Join all prefixed tables into one
我有多个表,即jibs3_posts
, jibs4_posts
, jibs5_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.