2016-10-10 2 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 таблицы и перейти с банковской вкладки le все имя bank_name, даже если контрольная таблица не имеет какой-либо записи.

Но текущий мой запрос дает, когда контрольная таблица имеет только запись, поэтому возвращается только один результат банка. Пожалуйста, проверьте и сообщите мне, где я 'm missing !!

ответ

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.