所有表中特定列的SUM值LIKE table_%

时间:2018-03-27 19:07:45

标签: php mysql sql

我需要帮助来创建一个SQL查询,以便从所有表LIKE table_%中提取特定列的值,因为这些表会随着时间的推移而增长,这必须根据下面的格式来满足新的表名

方案名称: database_01

表名: tb_data _' ' _' MONTH '

  • MONTH 都是2011年至2018年所有12个月和几年的价值。

每个表都包含一个名为TOTAL_VALUE的列。我有一个PHP脚本,触发SQL查询从数据库中提取数据。

我想将每个表的总数TOTAL_VALUE列为SUM并保存下面的脚本值来推送数组。

$sql = "SELECT TOTAL_VALUES FROM tb_data_2017_october";   
$result = mysqli_query($conn, $sql);

$data = array(); while($enr = mysqli_fetch_assoc($result)){
    $a =  array($enr['TOTAL_VALUES']);
    foreach ($a as $as){
        echo "'".$as."', ";}
    array_push($data, $as); }

我一直在尝试使用以下选项来修改SQL:

SELECT id FROM table1
    UNION
    SELECT id FROM table2
    UNION
    SELECT id FROM table3
    UNION
    SELECT id FROM table4

但是我需要满足检查所有表格的能力,例如tb_data _%

3 个答案:

答案 0 :(得分:0)

使用MERGE存储引擎创建一个结合了所有月度表的虚拟表。

CREATE TABLE tb_all_data (
    ...
) ENGINE=MERGE UNION=(tb_data_2017_october, tb_data_2017_november, ...);

列出UNION=列表中的所有表,并在创建新表时更新它。

然后您可以从tb_all_data查询。

答案 1 :(得分:0)

试试这个 - 它会遍历所有你想要的模式表并为你创建总和:

declare @table table (rowid int identity, name varchar(max))
        insert @table
        select name from sys.tables where name like '%yourname%'

        declare @holding table (name varchar(max), sumvalue int)

        declare @iterator int = 1
        declare @tablename varchar(max)
        while @iterator<=(select max(rowid) from @table)
        begin
        select @tablename=name from @table where rowid=@iterator

        insert @holding
        exec('select '+@tablename+' sum(TOTAL_VALUE)TOTAL_VALUE from '+@tablename+' group by +'+@tablename+'')

        set @iterator=@iterator+1
        end 

    select * from @holding

答案 2 :(得分:0)

有关获取表格列表的信息,请参阅此问题:Get table names using SELECT statement in MySQL

您可以在一个查询结果中获取表列表,然后查询每个表。我会稍微修改你的代码,举个例子:

// Get the tables
$tables_sql = "SELECT table_name 
                FROM information_schema.tables 
                WHERE table_schema='<your DB>' 
                AND table_name LIKE 'tb_data%'";  

$tables = mysqli_query($conn, $sql);

// Iterate over the tables
while($table = mysqli_fetch_assoc($tables)){
{
    /*
    * Your code
    */

    // This query assumes that you can trust your table names not to to an SQL injection
    $sql = "SELECT TOTAL_VALUES FROM " . $table['table_name']; 
    $result = mysqli_query($conn, $sql);

    $data = array(); while($enr = mysqli_fetch_assoc($result)){
        $a =  array($enr['TOTAL_VALUES']);
        foreach ($a as $as){
            echo "'".$as."', ";
        array_push($data, $as); }
}

一旦有了表格列表,就可以做任何你需要的事情。您可以构建一个大的联合查询(比单独查询每个表更有效),或者将表提供给MERGE引擎,如barmar's answer