1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
create table proposition
(
id_candidat int,
id_entreprise int,
t_contrat int,
salaire decimal(8,2)
);
-- Jeu de test "avec différents cas qui vont bien"
insert into proposition (id_candidat, id_entreprise, t_contrat, salaire) values (1, 1, 1, 2000);
insert into proposition (id_candidat, id_entreprise, t_contrat, salaire) values (1, 2, 2, 3000);
insert into proposition (id_candidat, id_entreprise, t_contrat, salaire) values (1, 3, 1, 2500);
insert into proposition (id_candidat, id_entreprise, t_contrat, salaire) values (2, 5, 1, 2000);
insert into proposition (id_candidat, id_entreprise, t_contrat, salaire) values (2, 4, 2, 2500);
insert into proposition (id_candidat, id_entreprise, t_contrat, salaire) values (3, 1, 2, 2500);
insert into proposition (id_candidat, id_entreprise, t_contrat, salaire) values (3, 3, 2, 3500);
select p1.id_candidat, p1.id_entreprise
from proposition p1
inner join (
select p2.id_candidat, MAX(p2.salaire) salaire
from proposition p2
inner join (
select p3.id_candidat, MIN(p3.t_contrat) t_contrat
from proposition p3
group by p3.id_candidat
) t2 on t2.id_candidat = p2.id_candidat and t2.t_contrat = p2.t_contrat
group by p2.id_candidat
) t1 on t1.id_candidat = p1.id_candidat and t1.salaire = p1.salaire;
-- Retourne les 3 donnes propositions
SELECT *
FROM proposition AS tbl
WHERE EXISTS
( SELECT 1
FROM proposition AS sel
WHERE tbl.id_candidat = sel.id_candidat
HAVING tbl.t_contrat = MIN(sel.t_contrat)
AND tbl.salaire = MAX(sel.salaire)
);
-- Ne retourne qu'une seule ligne qui ne correspond pas à ce qu'on cherche
drop table proposition; |
Partager