1

従業員のスケジュール DB をチェックする MySQL クエリがあり、(以前の stackoverflow の質問のおかげで) ユーザーが働いていない日を「No Work」として返すため、ユーザーが木曜日に働いていない場合、クエリは満たされます。元の結果セットには日付が表示されませんが、その日付に含まれています (そのため、PHP スクリプトを使用してこれらの空白を埋める必要はありません)。

問題は、ユーザーが今から 2 週間後のスケジュールを確認している場合、その週全体が「No Work」と表示されることです。結果がない場合、スクリプトは「申し訳ありませんが、今週のスケジュールは投稿されていません」と出力する必要があります。これにより、ユーザーは、その週が休みで、後で確認する必要があると誤解することがなくなります。

質問は次のようなものに最適なクエリ構文は何ですか:

SELECT 
If Count(*) > 0 {
COALESCE(gooddata, nulldata) AS thedata
etc.
etc.
FROM sched_table
WHERE dates BETWEEN xxx AND yyy

すべての行が null (または count が 0) の場合、行を返さないためです。

カウント用の列を追加して、スクリプトの出力を「投稿されていません」にして、1回の反復後に終了しようとしましたが、良い週には1回の反復後に終了するので、イライラしています。

一歩後退すれば、スクリプトでやりたいことを実行できると確信していますが、クエリでそれを実行する方法があり、少なくとも1行が必要になるかどうか非常に興味があります他のヌル行を合体させるための非ヌル値。

4

3 に答える 3

2

実際、データベースを使用して行レベルの書式設定/条件付き出力操作を行うと、行き過ぎてしまう可能性があると私は考えています。実際には、PHP は MySQL よりも文字列の比較と演算がはるかに高速です。私が一緒に仕事をしてきた開発者の間の暗黙のポリシーは、出力をフォーマットするためにデータベースを使用しないということでした。

他の人がこの提案に同意するかどうか知りたいです。私は実際にそれを新しい質問として投稿するかもしれません...出力をフォーマットするためにデータベースを使用する際に、どこに線を引くのですか?

于 2009-07-23T13:20:21.677 に答える
2

ああ、2 つの内部選択との結合、そのうちの 1 つは条件付きで存在しますか? 真剣ですか?単純な UNION を使用して空白を埋めるのはどうですか?? :) 何かのようなもの

SELECT real_week_data UNION SELECT fake_empty_week;

このUNIONは、あなたが望むものを正確に提供し、あなたのために結果をユニークにします..

于 2011-05-06T07:47:15.263 に答える
0

ほとんどの場合、クエリは何らかの種類の行セットと結合して、すべての曜日を生成します。

その行セットに条件を追加します。

SELECT  COALESCE(gooddata, nulldata) AS thedata
FROM    (
        SELECT  *
        FROM    days_of_week
        WHERE   EXISTS
                (
                SELECT  NULL
                FROM    sched_data
                WHERE   dates BETWEEN xxx AND yyy
                )
        )
LEFT OUTER JOIN
        sched_data
WHERE   dates BETWEEN xxx AND yyy
于 2009-07-23T14:14:16.290 に答える