質問を理解しているかどうかは完全にはわかりませんが、これが必要だと思います:
select count(codes.lcfruh) as front_lcfruh,
dienstplan.kw,
dienstplan.datum
from dienstplan
left join codes on dienstplan.schicht = codes.lcfruh and codes.lcfruh <> ''
left join personal on personal.perso_id = dienstplan.perso_id
and personal.status = 'rezeption'
and dienstplan.kw = $kw
group by dienstplan.datum, dienstplan.kw
schicht
から来る場合は、dienstplan
常にそのための行があります(それが駆動テーブルであるため)。あなたが正しく理解している0
場合は、一致する行が見つからない場合に必要です。したがって、結合されたテーブルをカウントする必要があります。
編集:
条件where codes.lcfruh != ''
は、外部結合を内部結合に戻します。これは、「外部」行には lcfruh が NULL として含まれ、NULL との比較では「不明」となるため、最終結果から行が削除されるためです。codes
空の文字列を含むテーブルの行を除外する場合はlcfruh
、その条件を JOIN 句に移動する必要があります (上記を参照)。
さらに 2 つのこと: 複数のテーブルを含むクエリで、列にプレフィックスを付けることに慣れてください。これにより、あいまいさが回避され、変更に対してクエリがより安定します。また、数値リテラルと文字列リテラルの違い1
は、数値'1'
が文字列であることも理解する必要があります。数値が期待される場所で文字列リテラルを使用するのは悪い習慣です。MySQL は常に「何とか」動作しようとするため、非常に寛容ですが、他の DBMS を使用すると、理解できないエラーが発生する可能性があります。
さらに、の使用法group by
が間違っているため、「ランダムな」値が返されます。理由を理解するには、これらのブログ投稿を参照してください。
他のすべての DBMS は、現在記述されている方法でクエリを拒否します (より ANSI 準拠のモードをオンにすると、MySQL も同様に拒否されます)。