簡體   English   中英

MySQL:多表查詢

[英]MySQL: Query from multiple tables

我有一個數據庫 MySQL 8.0,有 12 個表(每個月一個),其中包含有關客戶的信息。 所有表格都有一個客戶 ID 和他們節省的金額。 例如,兩個月:

+------------------+
+      January     +
+------------------+
+ ClienID | Amount + 
+------------------+
+ qwer23  | 23     +

+------------------+
+      December     +
+------------------+
+ ClienID | Amount + 
+------------------+
+ qwer23  | 15     +

我想得到一張帶有ClientID和每月金額的表格。 像這樣

+------------------+----------------+----------+
+ ClienID | January|                | December |
+------------------+----------------+----------+
+ qwer23  | 23     |                |     15   |

我搜索了一些選項,但我不確定如何使用 JOIN 或 GROUP+BY。

我有一個數據庫 MySQL 8.0 有 12 個表(每個月一個)

我認為這不是一個好的數據庫設計,您不應該將月份存儲在不同的表中。

對於給定的數據,一種方法是在所有月份都使用 union,請嘗試:

select ClienID,
       max(January) as January,
       max(Febrary) as Febrary,
       max(December) as December
from ( 
     select ClienID,amount  as 'January',null as 'Febrary', null as 'December'
     from January
  union 
     select ClienID,null  as 'January',null as 'Febrary',amount   as 'December'
     from December 
      ) as months_tbl
group by ClienID;     

這僅簡化了 3 個月,您需要為每個月添加一個 union 子句,並且上述查詢為每個不同的 ClienID 考慮了一個值。

https://dbfiddle.uk/GFvbY_ru

完整的查詢如下:

select ClienID,
       max(January) as January,
       max(Febrary) as Febrary,
       max(March) as March,
       max(April) as April,
       max(May) as May,
       max(June) as June,
       max(July) as July,
       max(August) as August,
       max(September) as September,
       max(October) as October,
       max(November) as November,
       max(December) as December
from ( 
     select ClienID,amount  as 'January',null as 'February', null as 'March', null as 'April', null as 'May', null as 'June', null as 'July', null as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
     from January
  union 
     select ClienID,null  as 'January',amount as 'February', null as 'March', null as 'April', null as 'May', null as 'June', null as 'July', null as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
     from February
  union 
     select ClienID,null  as 'January',null as 'February', amount as 'March', null as 'April', null as 'May', null as 'June', null as 'July', null as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
     from March
  union 
       select ClienID,null  as 'January',null as 'February', null as 'March', amount as 'April', null as 'May', null as 'June', null as 'July', null as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
     from April
  union 
       select ClienID,null  as 'January',null as 'February', null as 'March', null as 'April', amount as 'May', null as 'June', null as 'July', null as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
     from May
  union 
       select ClienID,null  as 'January',null as 'February', null as 'March', null as 'April', null as 'May', amount as 'June', null as 'July', null as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
     from June
  union 
       select ClienID,null  as 'January',null as 'February', null as 'March', null as 'April', null as 'May', null as 'June', amount as 'July', null as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
     from July
  union 
       select ClienID,null  as 'January',null as 'February', null as 'March', null as 'April', null as 'May', null as 'June', null as 'July', amount as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
     from August
  union 
         select ClienID,null  as 'January',null as 'February', null as 'March', null as 'April', null as 'May', null as 'June', null as 'July', null as 'August', amount as 'September', null as 'October', null as 'November', null as 'December'
     from September
  union 
         select ClienID,null  as 'January',null as 'February', null as 'March', null as 'April', null as 'May', null as 'June', null as 'July', null as 'August', null as 'September', amount as 'October', null as 'November', null as 'December'
     from October
  union 
         select ClienID,null  as 'January',null as 'February', null as 'March', null as 'April', null as 'May', null as 'June', null as 'July', null as 'August', null as 'September', null as 'October', amount as 'November', null as 'December'
     from November
  union 
         select ClienID,null  as 'January',null as 'February', null as 'March', null as 'April', null as 'May', null as 'June', null as 'July', null as 'August', null as 'September', null as 'October', null as 'November', amount as 'December'
     from December
      ) as months_tbl
group by ClienID;  

您在 12 個月中的每個月都有一個表,並且客戶在每個表中最多可以有一行。 要為每個客戶獲取所有每月金額的結果行,您需要完全外部連接客戶 ID 上的所有表。 然而,MySQL 仍然不支持完全外連接。

由於這些表有一個客戶端 ID,我假設這些 ID 鏈接到的還有一個客戶端表。 因此,只需 select 客戶表中的客戶和外部加入月份:

select
  clientid,
  january.amount as january,
  february.amount as february,
  ...
  december.amount as december
from client
left outer join january using (clientid)
left outer join february using (clientid)
...
left outer join december using (clientid);

如果您沒有客戶端表(這似乎不太可能),您可以通過替換來即時創建一個

from client

經過

from
(
  select clientid from january  union
  select clientid from february union
  ...
  select clientid from december
) client

暫無
暫無

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

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