簡體   English   中英

MySQL多表查詢並總結

[英]Query from multiple table in MySQL and sum up

我有七個表(從 XT1 到 XT7),每個表的結構如下:


日期 米1 平方米 立方米
2021-06-01 4 2 6
2021-06-02 3 2 5
2021-06-03 12 2 14
..... .. .. ..

我只需要每個表的 m3 值。 我想要做的是在一個表中顯示所有 m3 值並將它們總結如下:

日期 XT1.m3 XT2.m3 XT3.m3 XT4.m3 XT5.m3 XT6.m3 XT7.m3 小計 XT1~7.m3
2021-06-01 6 7 8 6 7 8 8 50
2021-06-02 6 7 8 6 7 8 8 50
2021-06-03 6 7 8 6 7 8 8 50
全部的 18 21 24 18 21 24 24 150

我之前嘗試過的:

select (TX1.m3+TX2.m3+TX3.m3...) AS subtotal, date_format(date, '%Y-%m') as date,TX1.m3,TX2.m3,TX3.m3
from TX1 AS c1 left join TX2 AS c2 on TX1.date=TX2.date
left join TX3 AS c3 on TX2.date=TX3.date

這是從以前的工作腳本修改而來的。 但是舊的結構只有 3 張桌子,現在我有 7 張。

更新:嘗試了以下操作

SELECT TX1.date,TX1.m3,TX2.m3,TX2.m3...TX7.m3
FROM TX1
inner JOIN TX2 ON TX1.date = TX2.date
inner JOIN TX3 ON TX2.date = TX3.date
......
inner JOIN TX7 ON TX6.date = TX7.date

上面的代碼將返回一個未分組的矩陣。 試圖用“日期”分組並返回錯誤 1055。覆蓋

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

現在有效,但不確定這是否是正確的方法。 有任何想法嗎?

如果您想使用相同的查詢結構添加新創建的表,您可以嘗試使用准備好的語句。 例如:

准備字段值:

/*setting variables as NULL*/
SET @sql = NULL;
SET @tbl = NULL;
SET @val1 = NULL;
SET @val2 = NULL;
SET @reftbl = 'TX1'; /*this is your reference (most left) table in the LEFT JOIN*/

/*setting each variables with values*/

SELECT GROUP_CONCAT(CONCAT(table_name,'.',column_name,' AS ',table_name,column_name) SEPARATOR ', ') INTO @val1
FROM information_schema.columns 
WHERE table_name LIKE 'TX%'
#AND table_schema=your_database_name
AND column_name='m3';

SELECT CONCAT(GROUP_CONCAT(CONCAT(table_name,'.',column_name) ORDER BY table_name SEPARATOR '+' ),' as subtotal') INTO @val2
FROM information_schema.columns 
WHERE table_name LIKE 'TX%'
#AND table_schema=your_database_name
AND column_name='m3'

這里我們使用information_schema.columns表來生成來自與條件( table_nametable_schema )對應的所有表的所有m3列的字段。 這將返回給你類似的東西:

@val1: TX1.m3 AS TX1m3, TX2.m3 AS TX2m3, TX3.m3 AS TX3m3, TX4.m3 AS TX4m3, TX5.m3 AS TX5m3, TX6.m3 AS TX6m3, TX7.m3 AS TX7m3

@val2:TX1.m3+TX2.m3+TX3.m3+TX4.m3+TX5.m3+TX6.m3+TX7.m3 as subtotal

接下來是准備查詢所需的表並添加LEFT JOIN

SELECT CONCAT(@reftbl, 
          GROUP_CONCAT(
               CASE WHEN tbn IS NOT NULL 
               THEN CONCAT(' LEFT JOIN ', table_name,' ON ',tbn,'.date =',table_name,'.date') 
          ELSE table_name END SEPARATOR ' ')) INTO @tbl
FROM
(SELECT @reftbl tbn,
       table_name 
FROM information_schema.tables 
WHERE table_name LIKE 'TX%'
#AND table_schema=your_database_name
AND table_name <> @reftbl) v;

我在這里做的操作是使用CONCATGROUP_CONCAT生成LEFT JOIN部分。

然后我們使用基於我們之前設置的所有變量生成的查詢來設置@sql變量; 使用CONCAT構建。

/*constructing query and set into @sql*/
SET @sql = CONCAT('SELECT DATE_FORMAT(TX1.DATE, "%Y-%m") AS DATE,',@val1,',',@val2,'
               FROM ',@tbl,';'); 

這將最終得到如下查詢:

SELECT DATE_FORMAT(TX1.DATE, "%Y-%m") AS DATE,TX1.m3 AS TX1m3, TX2.m3 AS TX2m3, 
       TX3.m3 AS TX3m3, TX4.m3 AS TX4m3, TX5.m3 AS TX5m3, TX6.m3 AS TX6m3, TX7.m3 AS TX7m3,
       TX1.m3+TX2.m3+TX3.m3+TX4.m3+TX5.m3+TX6.m3+TX7.m3 as subtotal
FROM TX1 LEFT JOIN TX2 ON TX1.date =TX2.date  
LEFT JOIN TX3 ON TX1.date =TX3.date  
LEFT JOIN TX4 ON TX1.date =TX4.date  
LEFT JOIN TX5 ON TX1.date =TX5.date  
LEFT JOIN TX6 ON TX1.date =TX6.date  
LEFT JOIN TX7 ON TX1.date =TX7.date;

最后,准備、執行然后釋放@sql語句,您將獲得所需的結果:

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt; 

這是一種生成“動態查詢”的方法,這意味着如果/當您添加/刪除表時,將生成帶有附加表或不帶已刪除表的查詢。 例如,如果有一個新表TX8 ,當您運行上面的查詢時,只要它與條件匹配,它就會在准備好的語句中包含TX8

這是一個演示小提琴,其中包括創建新表時的情況。

在另一個數據庫中,這個問題可以通過多個FULL連接來解決,但由於 MySql 不支持它們並且不能為 7 個表模擬它們,我會選擇UNION ALL

從每個表中,返回 8 列:1 列表示日期,1 列表示m3和 6 個null列。
使用UNION ALL組合它們並最終聚合:

SELECT date, 
       MAX(m3_1) m3_1, MAX(m3_2) m3_2, MAX(m3_3) m3_3, MAX(m3_4) m3_4, MAX(m3_5) m3_5, MAX(m3_6) m3_6, MAX(m3_7) m3_7,
       COALECSE(MAX(m3_1), 0) + COALECSE(MAX(m3_2), 0) + COALECSE(MAX(m3_3), 0) + COALECSE(MAX(m3_4), 0) + 
       COALECSE(MAX(m3_5), 0) + COALECSE(MAX(m3_6), 0) + COALECSE(MAX(m3_7), 0) subtotal
FROM (
  SELECT date, m3 m3_1, null m3_2, null m3_3, null m3_4, null m3_5, null m3_6, null m3_7 FROM XT1
  UNION ALL
  SELECT date, null, m3, null, null, null, null, null FROM XT2
  UNION ALL
  SELECT date, null, null, m3, null, null, null, null FROM XT3
  UNION ALL
  ............................................................
  SELECT date, null, null, null, null, null, null, m3 FROM XT7
) t
GROUP BY date

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM