0

次のクエリがあります(PHPを介して実行されます)。結果がNULLで表示されない場合、ゼロを表示するにはどうすればよいですか。

select count(schicht) as front_lcfruh,
       kw,
       datum
from dienstplan
  left join codes on dienstplan.schicht = codes.lcfruh
  left join personal on personal.perso_id = dienstplan.perso_id
where codes.lcfruh != ''
and   personal.status = 'rezeption'
and   dienstplan.kw = '$kw'
group by dienstplan.datum
4

5 に答える 5

0

質問を理解しているかどうかは完全にはわかりませんが、これが必要だと思います:

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 も同様に拒否されます)。

于 2013-09-24T20:58:45.450 に答える
0

COUNT() は NULL を返すことはできません。

Lorenzo は、SO コミュニティを支援するための参照を提供する必要があると述べました (コメントを参照)。そのフィードバックに基づいて、以下の回答を編集しました。

  1. ここで、MySQL の COUNT() 関数のドキュメントを参照してください。
  2. また、スタック オーバーフローの「can COUNT(*) ever return NULL」という記事を読むことも検討してください。
  3. または、 「COUNT(*) が NULL を返すのはいつですか」というタイトルのこの 1 つ
  4. または、 「COUNT(*) returns NULL」というタイトルのこれ
  5. または、 「COUNT(*) がゼロの場合は NULL を返す」というタイトルのこれ
  6. または、Oracle のフォーラムの「COUNT は NULL を返さない」というタイトルのこの記事を参照してください。
于 2013-09-25T12:02:13.807 に答える