2016-04-06 9 views
1

1対1の関係の列が1対多の関係のテーブルのすべての行を選択するmysqlクエリを作成しようとしています。 basicaly私は終了し、すべてのリードがされていませんしたい1.SQLは1対1の関係の1対1の列ではありません

私の失敗クエリ

SELECT * from `leads` 
LEFT JOIN `call_lead` on `leads`.`id` = `call_lead`.`lead_id` 
LEFT JOIN `call_result_codes` ON `call_lead`.`call_result_code_id` = `call_result_codes`.`id` 
AND `call_result_codes`.`finished` in (0) group by `leads`.`id` 

これが失敗し、まだすべては、彼らが終了した1

の予想される出力を使用してコードを持っている場合でも、リードを返しますID 12と

リードを可能とidでつながる2

表リード

_____________________ 
|id | name   | 
|2 | test name  |     
|8 | test name2 | 
|12 | test name2 | 

表は

_____________________________________________________ 
|id | lead_id | user_id | call_result_code_id |remark| 
|22 | 8  | 1  | 0     |test | 
|23 | 8  | 1  | 1     |test | 
|24 | 2  | 1  | 0     |test | 

をcall_lead 表のcall_result_codes

________________________________ 
|id | description | finished | 
|0 | not answering | 0  |     
|1 | not interested| 1  |    

答えて

1

を見つける場所に置く:

SELECT * FROM `leads` 
LEFT OUTER JOIN `call_lead` on `leads`.`id` = `call_lead`.`lead_id` 
WHERE NOT EXISTS(SELECT 1 FROM `call_result_codes` 
       WHERE `call_lead`.`call_result_code_id` = `call_result_codes`.`id` 
        AND `call_result_codes`.`finished` = 1) 

は、私はあなたがあまりにもcall_results_codesのレコードを持っていない人たちをしたい、あなたの期待出力が想定する、ように、その完成したレコード= 1を持っていないほど十分です。

+0

これは期待どおりに動作します。 – Maantje

+0

問題ありません! @ marsje – sagi

+0

今、エラーを発見しました。 call_leadに、結果コードが終了していないリードと同じリードで終了したレコードのレコードが1つある場合でも、それは返されます。 – Maantje

0

はこれを試してみてください。 結合条件にfinishカラムがあります。私はあなたがEXISTS()を使用することができ、結果に

SELECT * from `leads` 
LEFT JOIN `call_lead` on `leads`.`id` = `call_lead`.`lead_id` 
LEFT JOIN `call_result_codes` ON `call_lead`.`call_result_code_id` = `call_result_codes`.`id` 
WHERE `call_result_codes`.`finished` = 0 
group by `leads`.`id`