テーブル「時間」に必ず一致する行が含まれていない3つのテーブルでLEFT JOINを実行しています。しかし、そのテーブルに一致する行が見つからない場合、リンクされたデータは消えます。MySQL:JOIN中にテーブル行がない場合は「無視」
どうすればこの作品を作成できますか?
ありがとうございます。
テーブル「時間」に必ず一致する行が含まれていない3つのテーブルでLEFT JOINを実行しています。しかし、そのテーブルに一致する行が見つからない場合、リンクされたデータは消えます。MySQL:JOIN中にテーブル行がない場合は「無視」
どうすればこの作品を作成できますか?
ありがとうございます。
は
(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
を追加します
そして、私はあなたの基本的なクエリは、(括弧の下に参加して)正しいと思い参加
Hmと一致するものが見つからなかった場合、レコードは完全に結果から完全に削除されます。 – Ivar
私はすでにそれをテストしましたが、明らかにそうではありません - それは動作します!この場合、内部選択は有効な解決策であるのか、それとも散歩だけですか? – Ivar
あなたの要求によって異なります。いくつかの制約チェックのためにテーブルが必要ない場合は、おそらくテーブルへの参加をスキップする必要があります。 Explain to SQLを使用することができます。バージョン5.0.37より大きいmysqlを使用している場合は、プロファイリングを使用してクエリの速度を確認できます - http://dev.mysql.com/tech-resources/articles/using-new-query -profiler.html – ajreal
から時間を削除
ただ、私は
SUM(if(t.hours is NULL,0,t.hours)) AS time_hours
で
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を修正してください。
これを明確にする必要があります。 'time'テーブルで何も一致しない場合は、' time_hours'にどの値を入れるべきですか? –
@sandeepan:そして、私はtime_hoursとしてゼロを求めています。 – Ivar
レコード全体が失われていますか?左結合を使用していて、 'time'テーブル –