2010-11-21 5 views
0

テーブル「時間」に必ず一致する行が含まれていない3つのテーブルでLEFT JOINを実行しています。しかし、そのテーブルに一致する行が見つからない場合、リンクされたデータは消えます。MySQL:JOIN中にテーブル行がない場合は「無視」

どうすればこの作品を作成できますか?

ありがとうございます。

+0

これを明確にする必要があります。 'time'テーブルで何も一致しない場合は、' time_hours'にどの値を入れるべきですか? –

+0

@sandeepan:そして、私はtime_hoursとしてゼロを求めています。 – Ivar

+0

レコード全体が失われていますか?左結合を使用していて、 'time'テーブル –

答えて

1

(SELECT IFNULL(SUM(t.hours),0) FROM time WHERE time.job_id=j.job_id) AS time_hours

SUM(t.hours) AS time_hours

を交換してみ GROUP BY

WHERE t.job_id IS NOT NULLを追加します

そして、私はあなたの基本的なクエリは、(括弧の下に参加して)正しいと思い参加

+0

Hmと一致するものが見つからなかった場合、レコードは完全に結果から完全に削除されます。 – Ivar

+0

私はすでにそれをテストしましたが、明らかにそうではありません - それは動作します!この場合、内部選択は有効な解決策であるのか、それとも散歩だけですか? – Ivar

+0

あなたの要求によって異なります。いくつかの制約チェックのためにテーブルが必要ない場合は、おそらくテーブルへの参加をスキップする必要があります。 Explain to SQLを使用することができます。バージョン5.0.37より大きいmysqlを使用している場合は、プロファイリングを使用してクエリの速度を確認できます - http://dev.mysql.com/tech-resources/articles/using-new-query -profiler.html – ajreal

0

から時間を削除

ただ、私は

SUM(if(t.hours is NULL,0,t.hours)) AS time_hours 
0

SUM(t.hours) AS time_hours 

を置き換えますこれが問題であるかどうかは不明ですが、特定のMySQLバージョンの後にカンマ対ジョインの動作が変更されました。試してみてください

... 
FROM jobs AS j LEFT JOIN workers AS w ON w.id = j.worker_id 
LEFT JOIN clients AS c c.id = j.client_id 
LEFT JOIN `time` AS t ON j.id = t.job_id 
... 

また、@ajrealが示唆しているように、IFNULLでSUMを修正してください。

関連する問題