2017-06-19 11 views
0

を与えるものではありません合計で左ジョインをすることは私の要求SQL - 複数がここで期待される結果に

SELECT j.* , 
    c.name as client_name , 
    s.name as supplier_name, 
    s.ID as supplier_id , 
    mt.* , 
    SUM(pb.require_followup) as nb_followup, 
    SUM(ws.worked_time) as hours_on_job, 
    SUM(iv.total) as total_price, 
    SUM(iv.hour_expected) as hours_planned, 
    j.ID as ID 

FROM $wpdb->posts j 
LEFT JOIN ".Job::$META_TABLE." mt ON mt.post_id = j.ID 
LEFT JOIN ".Job::$LINK_TABLE_JOB_CONTACT." l1 ON l1.job_id = j.ID 
LEFT JOIN ".Contact::$TABLE_NAME." c ON c.ID = l1.contact_id 
LEFT JOIN ".Supplier::$TABLE_NAME." s ON s.ID = c.supplier_id 
LEFT JOIN ".Problem::$TABLE_NAME." pb ON pb.job_id = j.ID 
LEFT JOIN ".Worksheet::$TABLE_NAME." ws ON ws.job_id = j.ID 
LEFT JOIN ".Invoice::$TABLE_NAME." iv ON iv.job_id = j.ID 

WHERE j.post_status = 'publish' 
    AND j.post_type = 'job' 
    ".implode(' ',$where_condition)." 
GROUP BY j.ID 
ORDER BY j.post_date DESC 

問題は、SUMのためにその結果である私は、他のテーブルをJOINをLEFT時に間違っています。 例えば行53は、この要求は、最後の2 LEFTを除去することによって、正しい結果を単に返す代わり1

のnb_followupため105を与えるJOIN:LEFT JOIN ".Worksheet::$TABLE_NAME." ws ON ws.job_id = j.IDとだけLEFT JOIN ".Invoice::$TABLE_NAME." iv ON iv.job_id = j.IDを除去 がLEFT JOIN ".Invoice::$TABLE_NAME." iv ON iv.job_id = j.ID

SELECT j.* , 
    c.name as client_name , 
    s.name as supplier_name, 
    s.ID as supplier_id , 
    mt.* , 
    SUM(pb.require_followup) as nb_followup, 
    j.ID as ID 

FROM $wpdb->posts j 
LEFT JOIN ".Job::$META_TABLE." mt ON mt.post_id = j.ID 
LEFT JOIN ".Job::$LINK_TABLE_JOB_CONTACT." l1 ON l1.job_id = j.ID 
LEFT JOIN ".Contact::$TABLE_NAME." c ON c.ID = l1.contact_id 
LEFT JOIN ".Supplier::$TABLE_NAME." s ON s.ID = c.supplier_id 
LEFT JOIN ".Problem::$TABLE_NAME." pb ON pb.job_id = j.ID 


WHERE j.post_status = 'publish' 
    AND j.post_type = 'job' 
    ".implode(' ',$where_condition)." 
GROUP BY j.ID 
ORDER BY j.post_date DESC 

与えます

を再開するために53

行の結果として

完全な要求が105与える - >間違った15を与える最後の結合を削除1

する必要があります - >間違った最後の2を与える加入削除1

する必要があります1 - >正しい

あなたは計算する必要が
+0

問題は、 'ID'カラムだけでグループ化していますが、集約関数には表示されない他の多くのカラムを選択しているということです。あなたの質問は論理的には明確に定義されていません。 –

+0

Tim Biegeleisenとこれに同意すると、ロジックが正しく定義されていません。 – XepterX

+0

私は理解していませんが、答えを出そうとすることはできますか? – pajouk

答えて

0

ジョインする前にSUM()を実行してください。そうしないと、ジョインのために行が乗算されます。例えば

SELECT 
     j.ID as ID 
    , pb.nb_followup 
FROM $wpdb->posts j 
LEFT JOIN (select pb.job_id, SUM(pb.require_followup) as nb_followup from ".Problem::$TABLE_NAME." pb GROUP BY pb.job_id) pb ON pb.job_id = j.ID 

あなたが直面している他の問題は、MySQLがして、グループのために、「lazy syntax」を可能にすることです。この怠惰な構文を使わないでください。そうしないと、予期しないエラーやバグが発生します。 GROUP句のselect句の各カラムをREPEATするのは非常に簡単です。カラムがSUM()、COUNT()、MIN()、MAX()などの集計関数を使用している場合を除きます。

 
select a.col1, b.col2, c.col3 , sum(d.col4) 
from a 
inner join b on a.id = b.aid 
inner join c on b.id = c.bid 
inner join d on c.id = d.cid 
group by a.col1, b.col2, c.col3 
関連する問題