2009-08-19 10 views
3

私は現在、3つのテーブルを持っています。これは、私が人々のために特定の機器を予約するために使用しているテーブルです。ここで準複雑なPHP/MySQL Selectステートメント

は私のテーブルです:

tblEquipment: 
    id  name  description 
    1  Camera  Takes pictures 
    2  Projector  Projects pictures 
    3  Laptop   Portable Computer 


tblEvents: 
    id  start     end    first_name   last_name    email 
    1  2009-08-10  2009-08-11   John     Doe     [email protected] 
    2  2009-08-15  2009-08-16   Jane     Doe     [email protected] 


tblEventData: 
    id   eventID    equipmentID 
    1    1       1    
    2    1       2 

今、ユーザーは、彼らが利用可能なすべての機器が表示され、その要求された時間でクエリを提出します。

上記の例を使用して、ユーザーが8/10-8/11の間の機器を探している場合、利用可能な機器はequipmentID 3(ラップトップ)のみです。

要求された時間に基づいて使用可能な機器のみを返すようにクエリを作成するにはどうすればよいですか?

これは私がこれまでに作ってみたものですが、それは仕事を得ることはできません。

SELECT tblequipment.id as name, tblEvents.start as start, tblEvents.end as end 
FROM tblEquipment 
INNER JOIN tblEventData on tblEventData.equipmentID = tblEquipment.id 
INNER JOIN tblEvents on tbleventdata.eventID = tblEvents.id 
WHERE NOT EXISTS(SELECT * FROM tblEvents WHERE $end >= start AND $start <= end) 

任意のアイデア?ありがとう!

答えて

2

クエリには、イベントの開始時刻と終了時刻の間にのみ表示されるNOT EXISTSがあります。言い換えれば、「この期間内にイベントがない限り、すべての機器を選択する」。それはあなたが望むものではありません。あなたは欲しい: "イベントがない限り、すべての機器を選択するその機器を使用するこのタイムフレームで。

のようなものに変換します。

SELECT tblequipment.id as name 
FROM tblEquipment 
WHERE NOT EXISTS 
    (SELECT * FROM tblEvents 
    INNER JOIN tblEventData ON (tblEvents.id = tblEventData.eventID) 
    WHERE $end >= start AND $start <= end 
    AND tblEventData.equipmentID = tblEquipment.id) 

EDIT:彼らはあなたがあるかの時点で予約の唯一の機器を、選択することを主張するので、私はまた、外部クエリからJOIN Sを削除しましたあなたが答えようとしている質問にはまったく関連していません。

最終的な結果から除外する目的で、どの装置が予約されているかは、NOT EXISTSクエリ内で知る必要があります。

+0

しかし、VoteyDisciple、私は今、エラーを取得します:不明な列 'tblEquipment.equipmentID' where句 '任意のアイデアですか? –

+0

元のスキーマを誤読しました。その名前の列は実際にはありません。あなたはそれをtblEquipment.idという名前にしました - 別の変更と共に適切な編集を行います。 – VoteyDisciple

+0

最後の部分はtblEventData.equipmentID = tblEquipment.id – localshred

1

はそれが私はmysqlはコマンドではなく、フィールドとして最後の解釈だと思う

`end`

あるので、引用符で終わりを入れてみてください。

1

"end"はSQLの予約語です。 tblEvents.endに別の名前を付けてみてください。

+0

良い点は、私は先に進んでstartTimeとendTimeまで(私はプロジェクトに十分早いので)列名を変更しました。 – Dodinas

関連する問題