2011-11-11 5 views
0

J'ai 2 tables:Vérifiez si une personne est disponible

accounts

+------+------------------------+ 
| id | name     | 
+------+------------------------+ 
| 1 | John     | 
| 2 | Lee     | 
| 3 | Sarah     | 
| 4 | Michael    | 
+------+------------------------+ 

holidays

+------+---------+----------------+--------------+ 
| id | account | start_date | end_date | 
+------+---------+----------------+--------------+ 
| 1 | 2  | 11/11/11  | 15/11/11 | 
+------+---------+----------------+--------------+ 

Cela signifie que Lee n'est pas disponible 11/11/11 jusqu'au 15/11/11 (inclus)

J'ai besoin d'une requête qui va vérifier qui sont disponibles un jour donné. Par exemple, si je précise une date de 13/11/11 Lee ne serait pas disponible afin de récupérer uniquement les 3 autres comptes, mais si je spécifie une date de 16/11/11 tous les comptes disponibles

+1

Lee est 2, vacances est pour id compte 1. S'il vous plaît vérifier votre message. – zmilojko

+0

Merci pour cela, fixe –

+0

Voir mon commentaire ci-dessous, sur la cardinalité de la relation ... C'est une solution différente pour 1-1 et 1-n relation – zmilojko

Répondre

1
SELECT accounts.* 
from accounts 
where id not in (select accounts.id 
        from accounts 
        join holidays on accounts.id = holidays.account 
        where now() between holidays.start_date and holidays.end_date); 

Cette élimine tous les utilisateurs qui ont des vacances maintenant, même s'ils pourraient avoir un autre moment (cardinalité 1-n).

+0

mais peuvent-ils avoir plus d'un enregistrement? – zmilojko

+0

distinct n'aiderait pas, vous devez vérifier tous les utilisateurs qui ont des vacances maintenant (et peut-être aussi une autre fois, mais vous ne vous souciez pas) et ensuite les éliminer et montrer aux autres. donc le NOT IN et (YES) BETWEEN dans ce cas. – zmilojko

+0

Vous avez raison, c'est la bonne réponse, supprimé le mien. – Andrew

0

Essayez avec cette requête:

SELECT name FROM accounts 
LEFT JOIN holidays h ON accounts.id = holidays.account 
WHERE '20111111' NOT BETWEEN h.start_date AND h.end_date 
+0

@Downvoter: Vous voulez vous expliquer? –

+0

Je m'explique ... Que dois-je expliquer? Je ne comprends pas ... – aleroot

+0

+1 - juste pour compenser un vote douteux. La réponse est fausse (il faut laisser un compte, car un compte peut ne pas avoir de compte-rendu de vacances) – Andrew

0

Quelque chose comme ça?


select * from accounts 
    where id not in (select account 
          from holiday 
          where YOUR_DATE between start_date and end_date 
       ) 
+0

Veuillez lire notre FAQ sur le formatage. Cliquez sur le point d'interrogation orange à côté de la case où vous écrivez vos messages. –

0

essayez celui-ci

SELECT * FROM accounts a 
INNER JOIN holidays h 
    ON a.id=h.account 
WHERE '2011-11-13' NOT BETWEEN h.start_date AND h.end_date; 
Questions connexes