我有一个包含500多个表的数据库,每个表都具有相同的结构,包含来自传感器的历史数据。我试图提出一个查询,例如,找到传感器n超过x的所有实例。问题是表是动态的,查询必须能够动态获取表的列表。
我可以查询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;
答案 1 :(得分:0)
您将不得不创建一个存储过程。 你需要一个循环游标,它将遍历
中的每个记录SELECT table_name 来自information_schema.tables WHERE table_schema ='database_name';
然后你会想要建立一个像jbochi提供的那样长的SQL语句
@Statement = CONCAT(@ Statement,“UNION SELECT device_name,sensor_value FROM”,@ table_name,“WHERE sensor_value> 10”);
构建大型查询后,您将使用
对其进行执行PREPARE stmt FROM @Statement;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
注意:我真的不知道如何进行循环游标,抱歉
答案 2 :(得分:0)
最终要解决这个问题,我从单独的表中得到结果,然后在代码中进行循环和比较。之后,将所有传感器数据合并到一个表中并使用以前缺少的索引优化所述表的效率更高。
故事的寓意是,正确的表格结构是消除大量编码问题的关键!