1

特定の時間に予約をしていないすべてのインストラクターを返すように MySQL を取得しようとしています。このクエリは、基本的に検索クエリです。そのため、基本的にまだ予約されていないすべてのインストラクターとその詳細を返します。誰かが私がそれを終わらせるのを手伝ってくれませんか?

SELECT
  AddressTypes.AddressTypeName,
  Addresses.*,
  InstructorSettings.*,
  Users.*,
  BookedSlots.DateTime
FROM Users
  LEFT OUTER JOIN InstructorSettings
    ON Users.UserID = InstructorSettings.UserID
  LEFT OUTER JOIN Addresses
    ON Users.UserID = Addresses.UserID
  INNER JOIN AddressTypes
    ON Addresses.AddressTypeID = AddressTypes.AddressTypeID
  LEFT OUTER JOIN BookedSlots
    ON Users.UserID = BookedSlots.UserID
WHERE Users.AccountTYpe = 3 AND Addresses.PostCode1 IN ('l13') AND BookedSlots.DateTime <> '2013-04-25 11:00:00'

上記のクエリは何も返しませんが、「AND BookedSlots.DateTime <> '2013-04-25 11:00:00'」を取り出すと、すべてのインストラクターの詳細が正常に返されます。

データベース

4

2 に答える 2

0

あなたが探しているのは、指定された時間の BookedSlotsにレコードが存在しないことであるかのように私には見えます。

これが MySQL のベスト プラクティスと見なされるかどうかはわかりませんが、通常、次のようにjoinではなく、サブ選択または一時テーブルを使用してそのタスクを達成します。

SELECT
  AddressTypes.AddressTypeName,
  Addresses.*,
  InstructorSettings.*,
  Users.*,
FROM Users
  LEFT OUTER JOIN InstructorSettings
    ON Users.UserID = InstructorSettings.UserID
  LEFT OUTER JOIN Addresses
    ON Users.UserID = Addresses.UserID
  INNER JOIN AddressTypes
    ON Addresses.AddressTypeID = AddressTypes.AddressTypeID
WHERE Users.AccountType = 3 AND Addresses.PostCode1 IN ('l13') 
AND Users.UserID not in (SELECT BookedSlots.InstructorID FROM BookedSlots 
     WHERE BookedSlots.DateTime = '2013-04-25 11:00:00')

編集: コメントごとに、Select ステートメントを変更して BookedSlots を除外し、サブ選択を InstructorId を返すように変更しました (予約の学生ではなくインストラクターと一致します)。

于 2013-04-24T22:06:29.773 に答える