這裏是我的要求SQL - 多用和LEFT JOIN不會給預期的結果
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是錯誤的,當我LEFT JOIN另一個表。 例如,該行53給105
爲nb_followup代替1
如果這個請求通過移除最後2 LEFT返回正確的結果只是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
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
而且只去掉LEFT JOIN ".Invoice::$TABLE_NAME." iv ON iv.job_id = j.ID
會給15
作爲結果行53
要恢復
全部要求給予105
- >錯了應該是1
去掉最後一個加入給15
- >錯了應該是1
去掉最後2加入給1
- >正確
問題是,您只是通過「ID」列進行分組,但是您選擇的許多其他列沒有出現在聚合函數中。您的查詢在邏輯上不是很好定義。 –
同意Tim Biegeleisen對此,你的邏輯沒有正確定義。 – XepterX
我不太清楚明白,你可以嘗試提供答案嗎? – pajouk