2009-08-19 4 views
3

Ich habe derzeit 3 ​​Tabellen, die ich für Leute verwenden, um Reservierungen für bestimmte Geräte zu machen.Semi-Komplizierte PHP/MySQL Select-Anweisung

Hier sind meine Tabellen:

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 

Gerade jetzt, ein Benutzer eine Abfrage mit ihren geforderten Zeiten vorlegen, dann werden sie alle verfügbaren Geräte sehen.

Mit dem obigen Beispiel wird ein Benutzer, der nach einem Gerät zwischen 8/10-8/11 sucht, feststellen, dass das einzige Gerät verfügbar ist, das verfügbar ist: equipmentID 3 (Laptop).

Wie kann ich meine Abfrage erstellen, um nur die verfügbaren Geräte basierend auf den angeforderten Zeiten zurückzugeben?

Dies ist, was ich mit so weit habe kommen, kann es aber nicht an der Arbeit:

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) 

Irgendwelche Ideen? Vielen Dank!

Antwort

2

Die Abfrage, die Sie jetzt haben, hat eine NOT EXISTS Suche nur nach Ereignisse, die zwischen den angegebenen Start- und Endzeiten auftreten. Mit anderen Worten, "wählen Sie alle Geräte aus, solange es in diesem Zeitraum keine Ereignisse gibt." Das ist nicht was du willst. Sie möchten: "Alle Geräte auswählen, solange keine Ereignisse mit diesem Gerät in diesem Zeitraum vorhanden sind."

, die auf etwas übersetzt wie:

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: Ich habe entfernt auch die JOIN s von der äußeren Abfrage, da sie darauf bestehen, dass Sie nur Geräte auswählen, die zu einem bestimmten Zeitpunkt, die reserviert sind, ist überhaupt nicht relevant für die Frage, die Sie beantworten möchten.

Sie möchten wissen, welche Ausrüstung reserviert ist, aber innerhalb der NOT EXISTS Abfrage, um sie von Ihren Endergebnissen auszuschließen.

+0

Danke für die Antwort, VoteyDisciple, aber ich bekomme jetzt den Fehler: Unbekannte Spalte 'tblEquipment.equipment.ID' in 'Where-Klausel' Irgendwelche Idee? –

+0

Ich habe Ihr ursprüngliches Schema falsch gelesen. Es gibt tatsächlich keine Spalte mit diesem Namen; Sie haben es tblEquipment.id genannt - ich werde die entsprechende Änderung zusammen mit einer weiteren Änderung vornehmen. – VoteyDisciple

+0

das letzte Teil sollte nur tblEventData.equipmentID = tblEquipment.id – localshred

1

Versuchen in Anführungszeichen setzen Ende, so dass es

`end`

ist denke ich mysql Ende als Befehl interpretiert, statt ein Feld.

1

"Ende" ist ein reserviertes Wort in SQL. Versuchen Sie, tblEvents zu benennen.

+0

Guter Punkt, thx. Ich ging voran und änderte die Spaltennamen (da ich früh genug ins Projekt bin) zu startTime und endTime. – Dodinas