我有多个表,即jibs3_posts,jibs4_posts,jibs5_posts。诸若此类。有什么办法可以用jibs-prefix的通配符连接所有这些表吗?
例如:
SELECT * FROM 'jibs*_posts';对不起,如果这是一个副本,但找不到任何解决办法。
P.P.S .这是一个WordPress多金属矿
发布于 2019-01-16 14:23:48
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
end3-执行动态查询
PREPARE stmt1 FROM @sql
EXECUTE stmt1
DEALLOCATE PREPARE stmt1;我熟悉MSSQL语法,尽力为mysql找到正确的语法,但我相信逻辑是清楚的。希望一切都好,请告诉我。
发布于 2019-01-16 14:39:57
另一种选择。如果新的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即可。
当然,如果它们经常出现,那么维护起来就太麻烦了。
编辑:如果您想变得漂亮,可以使用periodically的dynamic生成一个ALTER VIEW语句来获取新的表,然后安排它定期运行。
发布于 2019-01-16 14:21:49
这在SQL中是不可能的,但是还有其他的方法。
如果有充分的理由放弃多个表(即,如果数据模型由一个公共表来满足),您可以进行从多个表到单个表的一次性转换。
如果有充分的理由保留多个表(即,如果您的数据模型中有某种东西,或者某种后勤限制,这就决定了这样的安排),那么这是一个组合工具的好情况。具体来说,您可以使用您最喜欢的编程或脚本语言来生成引用所有表的SQL,然后使用生成的SQL。
许多编程语言都允许您通过数据库绑定生成SQL并在同一个程序中使用它。
编辑:我看到您添加了wordpress标记(在它出现之前我就开始编写答案了),所以我不确定我的答案有多适用。也就是说,我不确定您有多少权限可以直接与数据库交互。如果您受到Wordpress所需内容和/或Wordpress允许您运行您想要运行的SQL的方式的限制,那么我的通用MySQL / SQL回答可能没有多大帮助。
不过,我的一般建议是用工具箱中的所有工具来解决这个问题,并考虑一种综合优势的方法,因为SQL不支持表名的通配符。
https://stackoverflow.com/questions/54218896
复制相似问题