Mysql 使用leftouterjoin和on子句从两个具有公共列的不同表中检索数据

Mysql 使用leftouterjoin和on子句从两个具有公共列的不同表中检索数据,mysql,left-join,Mysql,Left Join,伙计们,我有两张不同的桌子 表1: contract-id | contract-date 1 | 01-05-2016 1 | 01-06-2016 1 | 01-07-2016 2 | 01-01-2016 2 | 01-02-2016 3 | 01-05-2016 3 | 01-06-2016 表2: invoice-number|contract-

伙计们,我有两张不同的桌子

表1:

contract-id | contract-date
  1         | 01-05-2016
  1         | 01-06-2016
  1         | 01-07-2016
  2         | 01-01-2016
  2         | 01-02-2016
  3         | 01-05-2016
  3         | 01-06-2016
表2:

invoice-number|contract-id|invoice-from-date|invoice-to-date
 1            |1          |01-05-2016       |31-05-2016
 2            |1          |15-05-2016       |31-05-2016
 3            |1          |25-05-2016       |31-05-2016
我的要求是,我必须显示表1中当月的所有合同,并且我必须显示表2中这些合同的发票数量。如果有任何发票提出,它应该显示其计数或干脆零。预期的答案是:

contract-id|counts
 1         |3
 3         |0
合同id:1的计数为3,因为我已为当月开具了三张发票,而合同id:3的计数为0,因为我尚未开具任何发票。合同id:2丢失,因为它不在当前月份的范围内

select pvs.contract_id,
       count(ir.contract_id) as counts,
       pvs.contract_date
from cbm_contract_period_value_split as pvs
left join cbm_contract_invoice_request as ir
on pvs.contract_id = ir.contract_id
and MONTH(ir.invoice_for_the_period_of_from_date) = MONTH(CURDATE())
WHERE MONTH(pvs.contract_date) = MONTH(CURDATE())
GROUP BY pvs.contract_id,pvs.contract_date
这就是我尝试过的:

    select cbm_contract_period_value_split.contract_id,
count(cbm_contract_invoice_request.contract_id),
cbm_contract_period_value_split.contract_date
from cbm_contract_period_value_split
left outer join cbm_contract_invoice_request
on cbm_contract_period_value_split.contract_id = cbm_contract_invoice_request.contract_id
and MONTH(cbm_contract_period_value_split.contract_date) = MONTH(CURDATE())
and MONTH(cbm_contract_invoice_request.invoice_for_the_period_of_from_date) = MONTH(CURDATE())

我已经发布了这个问题,但是现在我发布了一个编辑版本,上面有我得到的答案。然而,我没有得到想要的答案。怎么了?我该怎么办?

试试这个。我认为您需要一个分组依据,我在WHERE中输入了筛选出不是当前月份的行的内容

select pvs.contract_id,
       count(ir.contract_id) as counts,
       pvs.contract_date
from cbm_contract_period_value_split as pvs
left join cbm_contract_invoice_request as ir
on pvs.contract_id = ir.contract_id
and MONTH(ir.invoice_for_the_period_of_from_date) = MONTH(CURDATE())
WHERE MONTH(pvs.contract_date) = MONTH(CURDATE())
GROUP BY pvs.contract_id,pvs.contract_date

结果

contract_id     counts  contract_date
1               3       May, 01 2016 00:00:00
3               0       May, 01 2016 00:00:00
尝试此查询

SELECT 
  t1.`contract-id`,
  (    
    CASE      
      WHEN t2.`contract-id` IS NULL 
      THEN 0 
      ELSE COUNT(*) 
    END
  ) AS counts 
FROM
  t1 
  LEFT JOIN t2 
    ON t1.`contract-id` = t2.`contract-id` 
WHERE MONTH(`contract-date`) = MONTH(CURDATE()) 
GROUP BY t2.`contract-id` 
ORDER BY t1.`contract-id`,`contract-date` ;

为什么合同id#2在#3仍然存在的情况下在您想要的结果中消失?这只是一个简单的例子,不需要考虑,因为它不在当月。