[英]SUM values of specific column from all tables LIKE table_%
我需要帮助来创建一个SQL查询,以便对所有表(如table_%)中特定列的值求和,因为这些表会随着时间增长,并且必须根据以下格式满足新表名的需要
方案名称: database_01
表名:tb_data_ 'YEAR '_' 月 '
每个表都包含一个称为TOTAL_VALUE的列。 我有一个php脚本,该脚本触发SQL查询以从数据库中提取数据。
我想对每个表的总计TOTAL_VALUE列求和,并在下面保存我的脚本的值以推送数组。
$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_%的表的能力
使用MERGE存储引擎创建包含所有月度表的虚拟表。
CREATE TABLE tb_all_data (
...
) ENGINE=MERGE UNION=(tb_data_2017_october, tb_data_2017_november, ...);
列出UNION=
列表中的所有表,并在创建新表时对其进行更新。
然后,您可以从tb_all_data
查询。
试试这个-它会以所需的模式遍历所有表并为您创建总和:
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
有关获取表列表的信息,请参见此问题: 在MySQL中使用SELECT语句获取表名称
您可以在一个查询结果中获得表列表,然后查询每个表。 我将稍微修改您的代码以举一个例子:
// 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的回答
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.