2016-10-10 136 views
1

我有2个表MYSQL LEFT JOIN结果不给

银行表

create table `banks` (
    `bank_id` int , 
    `bank_name` varchar (150), 
    `balance` double , 
    `b_date` date , 
    `delete_state` double 
); 
insert into `banks` (`bank_id`, `bank_name`, `balance`, `b_date`, `delete_state`) values('1','Emirates NBD','632008','2016-10-10','0'); 
insert into `banks` (`bank_id`, `bank_name`, `balance`, `b_date`, `delete_state`) values('3','HABIB BANK LIMITED','1134484','2016-10-10','0'); 

检查表

create table `cheque` (
    `ch_id` int , 
    `bank_id` int , 
    `amount` double , 
    `status` int, 
    `delete_state` double 
); 
insert into `cheque` (`ch_id`, `bank_id`, `amount`, `status`, `delete_state`) values('4','1','15000','2','0'); 
insert into `cheque` (`ch_id`, `bank_id`, `amount`, `status`, `delete_state`) values('9','1','250000','1','0'); 

我的MySQL查询

SELECT bk.*, SUM(amount) AS tot_amount, (bk.balance - SUM(amount)) AS bank_balance FROM banks bk LEFT JOIN cheque ch ON bk.bank_id = ch.bank_id 
WHERE ch.status = 1 AND bk.delete_state=0 AND ch.delete_state = 0 

我需要加入这两张表格并从银行标签页中获取所有银行的名称即使检查表没有任何条目..

但目前我的查询是给予当检查表只有入口,所以它只返回一个银行结果..请检查,让我知道我在哪里错过了!

回答

2

您需要通过bank_id进行分组。当你对一个问题进行分组时,你会得到你分组变量的每个值的结果。

SELECT bk.*, SUM(amount) AS tot_amount, (bk.balance - SUM(amount)) AS bank_balance 
FROM banks bk 
LEFT JOIN cheque ch ON (bk.bank_id = ch.bank_id AND ch.status = 1 AND ch.delete_state = 0) 
WHERE bk.delete_state=0 
GROUP BY bk.bank_id; 

SQL Fiddle

+0

云你请解释为什么GROUP BY在这里帮了忙? –

+0

这是工作,谢谢ALOT – Wazan

0

试试这个:

SELECT bk.*, 
     SUM(CASE WHEN bk.delete_state=0 THEN amount ELSE 0 END) AS tot_amount, 
     SUM(CASE WHEN bk.delete_state=0 THEN bk.balance ELSE 0 END) 
     - 
     SUM(CASE WHEN bk.delete_state=0 THEN amount ELSE 0 END) AS bank_balance 
FROM banks bk 
LEFT JOIN cheque ch ON bk.bank_id = ch.bank_id AND ch.status = 1 AND ch.delete_state = 0 
GROUP BY bk.`bank_id`, bk.`bank_name` 

的几个注意事项:

  • 该查询使用GROUP BY条款,所以每bank_id返回一个单独的记录。
  • 有关cheque表的谓词已从WHERE移至ON子句。否则LEFT JOIN变成INNER JOIN
  • 查询使用有条件汇总以至只有考虑与银行有关的记录bk.delete_state=0