2014-09-19 4 views
1

J'ai deux requêtes:obtenir des enregistrements de ces deux derniers mois excluant la liste des enregistrements d'aujourd'hui

requête suivante me retourner les détails des gardes qui travaillent aujourd'hui:

One:

SELECT 
    `guards`.`surname` 
    , `contracted_guard`.`con_id` 
    , `guards`.`street` 
    , `shifts`.`advised_sign_in` 
FROM 
    `guards` 
LEFT JOIN `contracted_guard` ON `contracted_guard`.`guard_id` = `guards`.`gid` 
LEFT JOIN `shifts` ON `shifts`.`guard_id` = `guards`.`gid` 
WHERE advised_sign_in >=CURDATE() 
AND advised_sign_in < CURDATE()+ INTERVAL 1 DAY 
GROUP BY `guards`.`gid` 
ORDER BY `guards`.`given_names` ASC 
LIMIT 400 

maintenant , la deuxième requête suivante me renvoie les détails des gardes qui ne travaillent pas aujourd'hui mais qui se sont connectés au moins une fois au cours des deux derniers mois (Ceci parce que pour obtenir la liste des gardes actifs car le système contient une énorme liste de gardes).

Interroger deux:

SELECT 
    `guards`.`surname` 
    , `contracted_guard`.`con_id` 
    , `guards`.`street` 
    , `shifts`.`advised_sign_in` 
FROM 
    `guards` 
    LEFT JOIN `contracted_guard` 
     ON (`contracted_guard`.`guard_id` = `guards`.`gid`) 
    LEFT JOIN `shifts` 
     ON (`shifts`.`guard_id` = `guards`.`gid`) 
WHERE (`shifts`. advised_sign_in !=CURDATE() AND advised_sign_in >= DATE_SUB(CURDATE(), INTERVAL 2 MONTH)) 
GROUP BY `guards`.`gid` 
ORDER BY `guards`.`given_names` ASC; 

Les deux requêtes fonctionnent très bien. Mais le problème est que la deuxième requête renvoie le résultat de ces gardes qui travaillent aussi aujourd'hui mais avec une ancienne date (c'est parce qu'ils se sont également connectés au cours des deux derniers mois). Bien que je veux la liste des gardes excluant les gardes qui travaillent aujourd'hui mais qui ont travaillé au cours des deux derniers mois.

Tous les indices seront très appréciés.

+0

Essayez 'SELECT ..., max (\' changements \ '\' advised_sign_in \ '.) Comme \ 'last_sign_in \' FROM ... 'pour obtenir l'heure de connexion la plus récente pour chaque' guard' et remplacer les identifiants correspondants dans votre 'clause WHERE'. Les requêtes 'GROUP BY' ne sont pas très utiles sans utiliser une" fonction d'accumulation "(' sum() ',' count() ',' max() ',' min' ...). – Lukas

Répondre

0

Vous souhaitez déplacer la condition à la date actuelle du where à la clause having:

SELECT `guards`.`surname`, `contracted_guard`.`con_id`, `guards`.`street`, `shifts`.`advised_sign_in` 
FROM `guards` 
    LEFT JOIN `contracted_guard` 
     ON (`contracted_guard`.`guard_id` = `guards`.`gid`) 
    LEFT JOIN `shifts` 
     ON (`shifts`.`guard_id` = `guards`.`gid`) 
WHERE advised_sign_in >= DATE_SUB(CURDATE(), INTERVAL 2 MONTH)) 
GROUP BY `guards`.`gid` 
HAVING sum(`shifts`. advised_sign_in = CURDATE()) = 0 
ORDER BY `guards`.`given_names` ASC; 
+0

Toujours pas de différence de résultat. –

+0

@RK. . . . Cela ne devrait pas retourner les gardes qui ont signé aujourd'hui. Est-il possible que 'advise_sign_in' ait un composant temps? Si oui, vous voulez 'avoir sum (date (' shifts'. Advise_sign_in) = CURDATE()) = 0'. –

Questions connexes