0

私はこのクエリにかなり近づいていると思いますが、クラックできないようで、最も効率的なアプローチがあるかどうかはわかりません.

ユーザーが予約されている日付の範囲から、ユーザーが予約されていない日を見つけようとしています。

スタッフのスケジューリングを考えてください。火曜日に出勤でき、今週の他の日に出勤する人を見つける必要があります。

私のクエリは現在次のようになっています

SELECT employees.uid、名前、日付
従業員から
LEFT JOIN storelocation ON employees.uid = storelocation.uid
emplyees.uid = schedule.uid の LEFT JOIN スケジュール
どこでスライド = 9308
AND 日付
BETWEEN '2009-11-10'
AND '2009-12-20'
AND NOT
存在する (

ユーザーIDを選択
FROMスケジュール
WHERE 日付 = '2009-11-11'
)

「存在しない」を含めない場合、1500 件の結果が得られます。「存在しない」フォームの選択のみを使用すると、200 件の結果が得られるため、これらのクエリは両方とも独立して機能します。ただし、作成したクエリは 0 の結果を返します。

4

2 に答える 2

1

次のようなものを試してみてください。

SELECT employees.uid, name, date
FROM users
LEFT JOIN storelocation ON employees.uid = storelocation.uid
LEFT JOIN schedule ON emplyees.uid = schedule.uid
WHERE slid =9308
AND date BETWEEN '2009-11-10' AND '2009-12-20'
AND employees.uid NOT IN (
    SELECT uid
    FROM schedule
    WHERE date = '2009-11-11'
)
于 2009-11-17T02:02:29.230 に答える
1

問題は、あなたNOT EXISTSが相関していないことであり、テーブルエイリアスを使用しないとこれを行うことができません:

   SELECT e.uid, 
          e.name, 
          s.date
     FROM EMPLOYEES e
LEFT JOIN STORELOCATION sl ON sl.uid = e.uid
LEFT JOIN schedule s ON s.uid = e.uid
                    AND s.date BETWEEN '2009-11-10'AND '2009-12-20'
    WHERE slid = 9308          
      AND NOT EXISTS (SELECT NULL
                        FROM SCHEDULE t
                       WHERE t.uid = e.uid
                         AND t.date = '2009-11-11')

SELECTin anEXISTS句は何もしません。 を使用できます。EXISTS( SELECT 1/0 ...これにより、「ゼロで除算できません」というエラーが発生するはずです。しかし、そうではありません... EXISTS1 つ以上のインスタンスが WHERE/etc 句に一致する場合にのみ true を返します。もっと読みたい場合は、SELECT句の内容が重要かどうかを尋ねるSOに関する多くの質問があります。

ジムの答えは、タイプミスは別として、私が提供した代替手段よりもMySQLの方が高速 あるはずです。理由の詳細については、次の記事を参照してください: NOT IN vs NOT EXISTS vs LEFT JOIN/IS NULL in MySQL .

于 2009-11-17T03:01:25.017 に答える