2016-10-10 4 views
1

Ich habe 2 TabellenMYSQL LEFT JOIN nicht dazu führen, geben

Banken Tabelle

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'); 

Prüftabelle

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'); 

Meine MySQL Query ist

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 

Ich muss beitreten Diese 2 Tabellen und erhalten von der Bank Registerkarte le alle bank_name's obwohl check Tabelle hat keinen Eintrag ..

Aber aktuelle meine Abfrage gibt, wenn Check-Tabelle mit nur Eintrag, So dass nur eine Bank Ergebnis zurück .. Bitte überprüfen Sie und lassen Sie mich wissen, wo ich Ich vermisse !!

Antwort

2

Sie müssen nach bank_id gruppieren. Wenn Sie eine Frage gruppieren, erhalten Sie das Ergebnis für jeden Wert für die Variable, die Sie gruppieren.

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

Cloud Sie erklären bitte, warum GROUP BY hier geholfen hat? –

+0

Das funktioniert, Vielen Dank – Wazan

0

Try this:

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` 

Ein paar Anmerkungen:

  • Die Abfrage verwendet eine GROUP BY-Klausel, eine so einen separaten Datensatz pro bank_id zurückzukehren.
  • Die Prädikate, die zu cheque Tabelle gehören, wurden von WHERE zu ON Klausel verschoben. Andernfalls wird LEFT JOIN zu INNER JOIN.
  • Die Abfrage verwendet bedingte Aggregation um nur in Betracht Aufzeichnungen nehmen mit bk.delete_state=0 zu Banken bezogen.