2017-06-23 1 views
0

J'ai une requête comme ceci:sélectionnez précédent record pour un groupe de Ids

SELECT id, id_employee, hours FROM WorkHours WHERE hours > 8; 

Comment choisir un précédent de travail des employés pour chacun qui a été sélectionné par cette requête?

Ainsi, pour la table comme ça (id, id_employee, heures):

1 - 1 - 5 
2 - 2 - 3 
3 - 1 - 9 
4 - 1 - 4 
5 - 2 - 4 
6 - 2 - 10 
7 - 2 - 7 
8 - 1 - 7 
9 - 2 - 9 

3 dossiers, 6 et 9 seront sélectionnés. Je aussi ce qu'il faut obtenir les dossiers 1, 5, 7. Fondamentalement, pour chaque fois que quelqu'un a fait des heures supplémentaires, je veux voir combien d'heures cette personne a dans la journée enregistrée précédemment.

+0

ce que l'on entend par « précédent de travail des employés » ? –

+0

pour chaque identifiant retourné l'identifiant précédent pour le même id_employé – Sergi0

+2

affiche vos données et le résultat attendu. – maSTAShuFu

Répondre

1

Vous pouvez obtenir le id précédent en utilisant une sous-requête corrélative:

SELECT wh.id, wh.id_employee, wh.hours, 
     (SELECT MAX(wh2.id) 
     FROM WorkHours wh2 
     WHERE wh2.id_employee = wh.id_employee AND wh2.id < wh.id 
     ) as prev_id 
FROM WorkHours wh 
WHERE wh.hours > 8; 

Ensuite, pour obtenir la ligne complète, utilisez un JOIN:

SELECT eh.*, wh.* 
FROM (SELECT wh.id, wh.id_employee, wh.hours, 
      (SELECT MAX(wh2.id) 
       FROM WorkHours wh2 
       WHERE wh2.id_employee = wh.id_employee AND wh2.id < wh.id 
      ) as prev_id 
     FROM WorkHours wh 
     WHERE wh.hours > 8 
    ) eh LEFT JOIN 
    WorkHours wh 
    ON wh.id_employee = eh.id_employee; 
+0

ne devrait-il pas être SELECT MAX (wh2.id)? – Sergi0

+0

@ Sergi0. . . Oui, merci (ou bien "ORDER BY wh2.id DESC LIMIT 1"). –