2009-03-27 9 views
1

Ich habe drei Tabellen:Zeilen auswählen basierend auf Datum und anderen Tabellen

 
computers, which has columns for id, serial number, make, model, etc 
users, which has columns for id, real name 
computer_usage, which has columns id, computer_id, user_id, start_date, end_date 

Die Datenbank alle Computer aufzeichnet, die wir haben, unsere Benutzer und die verwendet, was Computer, wenn.

Ich möchte eine Abfrage ausführen, die alle Computer auswählt, die keinen aktuellen Benutzer haben.

Dies wäre:

Es gibt eine computer_id, die überhaupt nicht in computer_usage existiert oder Es gibt eine computer_id, die innerhalb computer_usage existiert, die eine end_date von

hat Was ist der beste Weg der Auswahl dieser Datensätze?

Antwort

3

Try this:

SELECT * 
FROM computers 
WHERE id NOT IN 
    (SELECT computer_id 
    FROM computer_usage 
    WHERE end_date is NULL) 

Die Unterabfrage Sie alle Computer zeigt, die derzeit in Gebrauch sind (ein Datensatz vorhanden ist, so dass wir davon ausgehen, es eine start_date hat, aber keine end_date zugewiesen wurde).

Ich gehe hier davon aus, dass das Ende_Datum nicht gefüllt wird, bis die "Nutzung" abgeschlossen ist. Wenn das nicht korrekt ist (wenn die Enddaten vorbelegt, zum Beispiel) sind, dann tut nur:

SELECT * 
FROM computers 
WHERE id NOT IN 
    (SELECT computer_id 
    FROM computer_usage 
    WHERE start_date < getDate() 
    AND end_date > getDate()) 

Die Unterabfrage noch alle Computer zeigt, die derzeit „im Auftrag“ ist. Finden Sie einfach alle Computer, die nicht in dieser Gruppe sind. (Beachten Sie, dass ich "getDate" verwendet habe, was eine MS SQL-Funktion ist. Ich denke, dass das Äquivalent von mysql etwas mit TIMESTAMP zu tun hat.)

Verwandte Themen