2009-03-27 3 views
1

I ont trois tables:Sélection de lignes en fonction de la date et d'autres tableaux

 
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 

La base de données enregistre tous les ordinateurs que nous avons, nos utilisateurs, et qui a utilisé quel ordinateur quand.

Je souhaite exécuter une requête qui sélectionne tous les ordinateurs qui n'ont pas d'utilisateur en cours.

Ce serait:

Il y a un computer_id qui n'existe pas du tout dans les computer_usage ou Il y a un computer_id qui n'existe au sein computer_usage qui a un date_fin de

Quelle est la meilleure façon de sélectionner ces enregistrements?

Répondre

3

Essayez ceci:

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

La sous-requête vous montre tous les ordinateurs qui sont actuellement en cours d'utilisation (un enregistrement existe, donc nous supposons qu'il a un start_date, mais pas date_fin a été attribué).

Je suppose ici que le end_date n'est pas rempli jusqu'à ce que "l'utilisation" soit terminée. Si ce n'est pas correcte (si les dates de fin sont pré-affectés, par exemple), alors il suffit de faire:

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

Le sous-requête montre encore tous les ordinateurs qui sont actuellement « en mission ». Trouvez simplement tous les ordinateurs qui ne font pas partie de ce groupe. (Notez que j'ai utilisé "getDate", qui est une fonction MS SQL Je pense que l'équivalent de mysql est quelque chose à faire avec TIMESTAMP.)

Questions connexes