Mysql

離開並組合不為空的結果

  • July 20, 2017

我得到了一個帶有如下表的 MySQL 數據庫:

show create table c;
CREATE TABLE `c` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 -- and other columns
 PRIMARY KEY (`id`)
)
show create table c_r;
CREATE TABLE `c_r` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `c_id` int(11) DEFAULT NULL,
 `c_date` date DEFAULT NULL,
 `something_numeric` decimal(8,3) DEFAULT NULL,
 -- and other columns
 PRIMARY KEY (`id`),
 CONSTRAINT ... FOREIGN KEY (`c_id`) REFERENCES `c` (`id`)
)
show create table c_s;
CREATE TABLE `c_s` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `c_id` int(11) DEFAULT NULL,
 `c_date` date DEFAULT NULL
 `something_numeric` decimal(8,3) DEFAULT NULL,
 -- and other columns
 PRIMARY KEY (`id`),
 CONSTRAINT ... FOREIGN KEY (`c_id`) REFERENCES `c` (`id`)
)

現在,對於每個 ,我想要date來自 的something_numeric值的總和以及來自 的值的c_r總和。如果其中一個為空,我仍然想要另一個。我的輸出應該有一行。something_numeric``c_s``date

我看不出有什麼辦法。如果我join兩次,我只會得到兩個和c.id中都存在的日期;所以我需要兩次。但是,我如何確保每行都得到一行,無論它只存在於一個表中,只存在於另一個表中,還是兩者都存在?c_r``c_s``left join``date``date

如果沒有您的實際查詢嘗試,有些事情很難理解。

根據您所說,您只希望按日期分組,而不是來自c. 既然如此,根本不清楚是否c需要在查詢中。

以下查詢應該為您提供所需的總數,對於在c_r或中找到的所有日期c_s

SELECT c_date
     ,COALESCE(SUM(r_amount),0) as r_amount
     ,COALESCE(SUM(s_amount),0) as s_amount
 FROM (
       SELECT c_date, 0 as r_amount, something_numeric as s_amount
         FROM c_s
       UNION ALL
       SELECT c_date, something_numeric as r_amount, 0 as s_amount
         FROM c_r
      ) sq
GROUP BY c_date
;

如果您需要通過某個值來限制行,則子查詢中cINNER JOIN每個表要c單獨使用相同的WHERE子句。您可以交替地包含c子查詢SELECT列表中的值,並在主查詢中進行過濾,但這可能效率較低。

引用自:https://dba.stackexchange.com/questions/180350