2017-09-13 273 views
1

我有以下列表根据每周存档创建的表格。如何使用相同的表模式查询多个SQL表?

dbtable 
dbtable_01_04_2017 
dbtable_01_07_2017 
dbtable_02_09_2017 
dbtable_03_06_2017 
dbtable_05_08_2017 
dbtable_06_05_2017 
dbtable_08_04_2017 
dbtable_08_07_2017 
dbtable_09_09_2017 
dbtable_10_06_2017 
dbtable_12_08_2017 
dbtable_13_05_2017 
dbtable_15_04_2017 
dbtable_15_07_2017 
dbtable_17_06_2017 
dbtable_19_08_2017 
dbtable_20_05_2017 
dbtable_22_04_2017 
dbtable_22_07_2017 
dbtable_24_06_2017 
dbtable_26_08_2017 
dbtable_27_05_2017 
dbtable_29_04_2017 
dbtable_29_07_2017 

他们都具有完全相同的立柱结构:

TIME_STAMP,USERNAME,INFO,原因

我需要使用一次相同的查询,当然只能通过查询所有的人在下面的示例查询中更改表名。

SELECT * FROM dbtable WHERE USERNAME="XXXX"; 

我GOOGLE了一下,希望有一种方法来通配名称在查询中,但我了解到,SQL不支持。

基本上,我在寻找某种for循环迭代查询到多个表。

请注意,新表将每周根据我们的档案自动化添加。

+1

请证明有周表。然后我们会试着解释为什么这样没有优势。 –

回答

0

UNION ALL是最终溶液。

SELECT * FROM dbtable WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_01_04_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_01_07_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_02_09_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_03_06_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_05_08_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_06_05_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_08_04_2017 WHERE `USERNAME` LIKE '$variable' 

我能够通过使用上面的SQL查询来实现我所需要的。

2

这太长了评论。

问题是你的数据结构。具有相同格式的多个表通常是一个坏主意。你应该有一张表,并且有一个日期栏。

哦,等等,你关心的性能,因为每个现有的表大。这就是(大多数)数据库支持分区的原因。您可以在documentation中阅读。

如果不走这条路线,一种可能性是创建一个视图,所有表 - 然后当你添加一个表改变视图,以包含最新的表。当然,查询可能最终会读取所有表格,因此它们效率不高。

正确的解决方案是使用具有多个分区的单个表。

+1

或许按时间划分的唯一理由是如果您打算清除“旧”数据。请参阅http://mysql.rjweb.org/doc.php/partitionmaint –

0

您可以编写一个查询哪些表存在,并对这些表的SELECT的存储过程。