2009-12-15 143 views
1

我有一个包含500多个表的数据库,每个表具有相同的结构,其中包含来自传感器的历史数据。我试图想出一个查询来查找,例如,传感器n超过x的所有实例。问题是表是动态的,查询必须能够动态获取表的列表。MySql:查询多个相同的动态表

我可以查询INFORMATION_SCHEMA.TABLES拿到表的列表,像这样:

SELECT table_name 
FROM information_schema.tables 
WHERE table_schema = 'database_name'; 

我可以用它来创建程序中的循环,然后反复查询数据库,但它似乎像应该有办法让MySql做多表搜索。

我还没有能够使存储过程的作品,但我可以找到的例子通常用于搜索任何列中的字符串。我想专门查找所有表中存在的特定列中的数据。我承认我不明白如何正确使用存储过程,也不知道如何解决这个问题。

内环路示例查询是:

SELECT device_name, sensor_value 
FROM device_table 
WHERE sensor_value > 10; 

尝试以下不工作:

SELECT device_name, sensor_value 
FROM 
    (
    SELECT table_name FROM information_schema.tables WHERE table_schema = 'database_name' 
    ) 
WHERE sensor_value > 10; 

这导致一个错误:“每一个派生的表必须有自己的别名。 “

目标是让所有具有给定传感器值的设备在其日志(表格)中的任意位置出现。

最终,一旦我获得了表的列表,是否应该只在我的程序中循环,或者是否有更高效的查询结构?

回答

0

最终解决这个问题,我从单独的表结果和做我的循环和比较的代码。后来,将所有传感器数据合并到一个表格中,并使用以前缺失的索引对表格进行优化,效率更高。

这个故事的寓意是适当的表结构是消除大量编码头痛的关键!

1

你可以遍历所有的表动态创建一个单一的查询是这样的:

SELECT device_name, sensor_value FROM device_table WHERE sensor_value > 10 
UNION 
SELECT device_name, sensor_value FROM device_table2 WHERE sensor_value > 10 
UNION 
SELECT device_name, sensor_value FROM device_table3 WHERE sensor_value > 10; 
+0

对我来说,这与我目前在程序代码中执行的循环基本相同。我仍然必须为每个联合生成表名。这是一个可行的解决方案,但不幸的不是我所希望的。 – JYelton 2009-12-15 23:51:08

0

你将不得不创建一个存储过程。 您需要一个循环游标,它将穿过每条记录

SELECT table_name FROM information_schema。表 WHERE table_schema ='database_name';

然后你就会想建立一个长SQL statment像由jbochi提供的一个

@Statement = CONCAT(@Statement, “UNION SELECT设备名,如Sensor_value FROM”,@table_name,“WHERE如Sensor_value > 10“);

一旦大型查询建成你会

PREPARE语句FROM @Statement exectute它;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

注:我真的不知道该怎么办了循环光标,对不起

+0

我们在同一条船上,循环游标的事情!无论你如何接近它,我都认为这是一个循环。程序代码中的循环起作用,对数据库进行如此多的调用似乎很笨拙。 – JYelton 2009-12-15 23:52:48

+0

http://www.brainbell.com/tutorials/MySQL/Working_With_Cursors.htm 可能会帮助您使用游标。我将在稍后尝试,看看我是否可以学习它。 – MindStalker 2009-12-16 17:20:42