1

我有一个包含 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;

它会导致错误:“每个派生表都必须有自己的别名。”

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

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

4

3 回答 3

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;
于 2009-12-15T20:17:58.913 回答
0

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

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

然后你会想要建立一个长的 SQL 语句,就像 jbochi 提供的那样

@Statement = CONCAT(@Statement, " UNION SELECT device_name, sensor_value FROM " , @table_name , " WHERE sensor_value > 10 ");

建立大查询后,您将执行它

从@Statement 准备语句;

执行语句;

DEALLOCATE PREPARE stmt;

注意:我真的不知道如何做循环光标,对不起

于 2009-12-15T21:40:38.633 回答
0

最终,为了解决这个问题,我从单独的表中获取结果,并在代码中进行循环和比较。后来,将所有传感器数据合并到一个表中并使用索引优化该表,这变得更加高效,这在以前是缺失的。

这个故事的寓意是正确的表结构是消除许多编码难题的关键!

于 2010-05-04T19:16:45.080 回答