【问题标题】:MySql: Query multiple identical dynamic tablesMySql:查询多个相同的动态表
【发布时间】:2009-12-15 20:12:23
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: mysql mysql-error-1248


    【解决方案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;
    

    【讨论】:

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

    您将不得不创建一个存储过程。 您需要一个循环游标,它会遍历

    中的每条记录

    选择表名 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");

    一旦构建了大型查询,您将使用它来执行它

    PREPARE stmt FROM @Statement;

    执行语句;

    DEALLOCATE PREPARE stmt;

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

    【讨论】:

    • 我们在同一条船上,在循环光标的事情上!我想无论你如何处理它都是一个循环。程序代码中的循环有效,只是对数据库进行如此多的调用似乎很笨拙。
    • brainbell.com/tutorials/MySQL/Working_With_Cursors.htm 可能会帮助您使用光标。以后我会试试这个,看看能不能学会。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      相关资源
      最近更新 更多