[PHP] Requete SQL

Résolu/Fermé
Signaler
-
 Laeticia -
Bonjour à tous.

Je n'arrive pas à faire une rêquete SQL depuis un moment et je déprime :(

Si quelqu'un pourrait m'aider çà serait hyper cool

Voilà mon problème :
Je souhaite faire une requete à ma BD (mysql) pour recuperer une liste de produits (table : produits) mais remplissant certaines conditions :
1/ Il faut que le produit ai moins de un an.
2/ Il faut que le produit fasse plus de 10€
3 / Il faut que si le produit fait moins de 30€ qu'il ai moins de 6 mois.

Ma table produits a entre autre comme champs : "date_saisie" , "px"

Pour le 1/ j'ai mis un code qui marche bien :
$y=date('Y'); $y=$y-1;
$moins1=$y."".date('md');


Pour le 1/ et le 2/ ma requete marche bien :
$resquete="SELECT * FROM produits WHERE date_saisie>'$moins1' AND px_>='10.00'";


Mais je n'arrive pas a faire le test du 3/
J'ai essayé :
$resquete="SELECT * FROM produits WHERE date_saisie>'$moins1' AND px_>='10.00' AND NOT EXISTS (SELECT * FROM produits WHERE px_<'30.00' AND date_saisie<'20070231')";

(pour l'instant je mets la date - 6 mois en dur tant que ca marche pas apres je ferai le code)
mais ca ne marche PAS :( :(

Auriez vous une idée de comment je pourrai m'en sortir ??

En tout cas merci a vous de votre aide !

Laeticia,

10 réponses

Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 521
Pas besoin d'une requête imbriquée je pense:

_ Un produit de moins de 30€ implique qu'il ai moins de 6 mois.

Les seules valeurs qui rendent cette proposition fausse c'est:

Le produit fait moins de trente euros ET il a six mois et plus

Donc il faut vérifier que NON(Le produit fait moins de trente euros ET il a six mois et plus)

Donc sachant que $six_mois est la date de maintenant plus six_mois:
$rq = "SELECT * FROM produits WHERE date_saisie>'$moins1' AND px_>='10.00 AND NOT( px<30 AND date_saisie >= $six_mois")

1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41989 internautes nous ont dit merci ce mois-ci

Messages postés
230
Date d'inscription
jeudi 28 juin 2007
Statut
Membre
Dernière intervention
15 octobre 2007
148
Elle est pas mal aussi comme ça !
euh je pense pas que tu ai besoin de ca ""SELECT * FROM produits WHERE date_saisie>'$moins1' AND px_>='10.00' AND NOT EXISTS ("" tu voit?? tu aura la reponse a ta requete de toute manière

il faut juste que ton produit coute moins de 30 et qu'il ai moins de 6 mois

je pense dit moi si c ca je ferai des recherche plus approfondit si ca marche po
Messages postés
230
Date d'inscription
jeudi 28 juin 2007
Statut
Membre
Dernière intervention
15 octobre 2007
148
Essaie ça :

SELECT * FROM PRODUITS P1
WHERE P1.DATE_SAISIE > '$moins1'
AND P1.PX >='10.00'
AND NOT EXISTS (
SELECT 'x'
FROM PRODUITS P2
WHERE P1.ID = P2.ID
AND P2.DATE_SAISIE > '$moisMoins6'
AND P2.PX < '30.00')
Salut, merci de vos réponses

-> xenogears :
"il faut juste que ton produit coute moins de 30 et qu'il ai moins de 6 mois"

Il faut aussi que je recupere les produits de + de 30€ qui ont moins d'un an

-> Chacual :
Je vais essayé ta requete dessuite et je te dis

Encore MERCI pour vos réponses.

Laeticia,
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
854
Essai avec des sous requètes :
SELECT * FROM produits
   WHERE px_ >= '10.00'
   AND id IN (SELECT id FROM produits WHERE date_saisie < '20070231' AND px_ < '30.00')
   OR id IN (SELECT id FROM produits WHERE date_saisie > '$moins1')


Peut-être cela fonctionne ?

EDIT : pas vu les réponses avant :) Avec sous requete ca devrait fonctionner, mais tente plutot l'inverse avec un NOT IN plutot qu'un IN.
tient si ca peut t'aider j'ai tout un tas de requettes que j'ai realiser pour un site ... si ca peut t'aider pioche dedans et arranges les a ta sauce


La base de données est composée comme suit :
!! Faire un fichier .sql contenant toutes les cdes SQL de construction des tables et l’insertion des données.
Ne pas oublier de sauvegarder le fichier.
Schéma de la base :
emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
dept (deptno, dname, loc)
mission (missno, ciename, empno, locale, enddate)

Les attributs en gras sont les clés primaires et les attributs en italique sont les clés étrangères.

Extension de la base :
Relation dept

deptno dname loc
10 Accounting New-York
20 Research Dallas
30 Sales Chicago
40 Operations Boston

Relation emp
empno ename job mgr hiredate sal comm deptno
7369 Smith Clerk 7902 1981-12-17 800.00 \N 20
7499 Allen Salesman 7698 1981-02-20 1600.00 300.00 20
7521 Ward Salesman 7698 1981-02-22 1250.00 500.00 30
7566 Jones Manager 7839 1981-04-02 2975.00 \N 20
7654 Martin Salesman 7698 1981-09-28 1250.00 1400.00 30
7698 Blake Manager 7839 1981-05-01 2850.00 \N 30
7782 Clark Manager 7839 1981-06-09 2450.00 \N 10
7788 Scott Analyst 7566 1981-11-09 3000.00 \N 20
7839 King President \N 1981-11-17 5000.00 \N 10
7844 Turner Salesman 7698 1981-09-08 1500.00 0.00 30
7876 Adams Clerk 7788 1981-09-23 1100.00 \N 20
7900 James Clerk 7698 1981-12-03 950.00 \N 30
7902 Ford Analyst 7566 1981-12-03 3000.00 \N 20
7934 Miller Clerk 7782 1982-01-23 1300.00 \N 10

Relation mission

missno empno ciename locale enddate
209 7654 BMW Berlin 2001-02-09
212 7698 MacDo Chicago 2001-03-04
213 7902 Oracle Dallas 2001-04-11
214 7900 FIDAL Paris 2001-06-07
216 7698 IBM Chicago 2001-02-09
218 7499 Décathlon Clermont 2002-12-24
219 7782 BMW Chicago 2001-08-16

La valeur \N est la valeur NULL.

R1. Extraire les différentes valeurs de salaire présentes dans emp.

select distinct sal
from emp;


R2. Extraire tous les salaires de emp.

select sal
from emp;


R3. Extraire l’ensemble des jobs des employés de emp.

select job
from emp;


R4. Faire afficher les tables emp, dept et mission en entier.

SELECT *
FROM dept,emp,mission;


R5. Extraire les couples (job,mgr) correspondant aux employés de emp.

SELECT job,mgr
FROM emp;



b) Sélections :

R6. Extraire les missions qui se terminent avant le premier mai 2001 et qui ont lieu aux USA.

SELECT *
FROM mission
where enddate < '01-05-2001' And (locale='Chicago' OR locale='Dallas');


R7. Extraire les missions qui ont lieu dans une ville commençant par ‘C’.

select *
from mission
where locale
like 'C%':


R8. Extraire les noms des différents employés qui n’ont pas de commission en plus de leur salaire.

select *
from emp
where comm is null;


R9. Extraire les numéros et noms des employés ayant été embauchés entre les mois de mai et octobre (compris) 1981.

select empno,ename
from emp
where hiredate between '01-05-1981'
and '31-10-1981';


R10. Donner les numéros des différents départements qui possèdent des employés ayant une commission non nulle.

select *
from emp
where comm > '0';



c) Jointures :

R11. Donner les noms des départements qui possèdent au moins un employé dont le job est ‘Clerk’.

select *
from emp,dept
where job='Clerk';


R12. Donner les noms des employés qui effectuent une mission dans la ville où se trouve leur département. Donner dans la même requête le nom du département et la ville concernée.

select emp.ename,emp.deptno,locale
from emp,mission,dept
where emp.deptno=dept.deptno
and mission.empno = emp.empno
and dept.loc = mission.locale;


R13. Trouver les couples (employé,manager) qui n’appartiennent pas au même département. Présenter le résultat sous la forme : No du manager | Numero du manager | No de l’employé | numero de l’employé

select e2.ename"nom du Manager", e2.empno"N° Manager", e1.ename"Nom de l'Employé", e1.empno"N° Employé"
From emp e1, emp e2
where e1.mgr=e2.empno AND e1.deptno!=e2.deptno;


R14. Trouver les noms des vendeurs et des managers n’ayant pas de mission et ayant soit une commission non nulle, soit un salaire compris entre 2500.00 et 3000.00$.

select ename
from emp left outer join mission
on emp.empno=mission.empno
where mission.empno is null
and ((comm is not null and comm>0)
or sal between 2500 and 3000)
and job in ('salesman','manager');


R15. Trouver les noms des départements qui n’ont pas d’employé en mission.

select dept.dname
from dept left outer join emp
on dept.deptno = emp.deptno left outer join mission
on emp.empno=mission.empno
where mission.empno is null
and emp.deptno is null ;

ou

select dept.dname
from dept
where dept.deptno not in (select emp.deptno
from emp, mission
where emp.empno = mission.empno);


R16. Donner les noms des employés qui ont un ou plusieurs collègues qui touchent un salaire plus grand que le leur et qui appartiennent au même département.

select distinct e1.ename
from emp e1, emp e2
where e1.sal<e2.sal
and e1.deptno = e2.deptno;

R17. Même requête que R16 avec la présentation suivante :
Nom employé | Collègue qui gagne plus | N° du Département

select e1.ename"nom employé", e2.ename"qui gagne plus", e2.deptno"departement"
from emp e1, emp e2
where e1.sal<e2.sal
and e1.deptno = e2.deptno;

R18. (DIFFICILE) On veut obtenir une relation qui se présentera sous la forme :
N° département | Nom d’un employé qui est un manager | Nom d’un employé
On veut trouver les couples d’employés qui travaillent dans le même département et dont le premier est un manager mais pas directement manager du second. Par exemple si A est le manager de B et B est le manager de C, et A, B et C sont dans le même département, alors (A,C) est un couple solution de la requête (mais ni (B,C), ni (A,B)).

d) Calculs verticaux :

R19. Trouver le total des salaires du département sales.

select SUM(sal)
from dept, emp
where dname='sales'
and emp.deptno = dept.deptno;


R20. Trouver les nom, job et salaire de l’employé ayant le salaire le plus élevé.
R21. Trouver le nombre de managers.
R22. Trouver le salaire moyen des employés qui sont en mission.
R23. S’il est en mission, trouver la date de fin de mission de l’employé qui est dans l’entreprise depuis le plus longtemps.

e) Calculs horizontaux :

R24. Trouver les nom, salaire, commission, salaire+commission de tous les vendeurs.

select ename"nom", sal"salaire", comm"commition", (sal + comm)"versement"
from emp
where emp.job= 'salesman';

R25. Trouver les noms des employés qui touchent une commission comprise entre 35 et 120% de leur salaire.
R26. Nom des employés dont le manager gagne plus du double de leur salaire.

select e1.ename
from emp e1, emp e2
where e1.mgr = e2.empno
and e2.sal > 2*e1.sal;


R27. Afficher les noms des employés cadrés à droite.
Super !

MERCI BEAUCOUP a vous TOUS !!!

Ma requete marche nickel !

Vous me sauvez !

Vraiment merci !

Par contre je ne sais pas mettre comment mettre la balise [resolu] à mon post :S lol
@ bientot,
Laeticia,
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 521
C'est quoi ta requête finale alors? Ca aidera les prochains qui auront des problèmes similaires.

J'ai mis le topic à "résolu".
Sinon pour le mettre toi même à "résolu" pour un éventuel futur fil de discussion, il faut que tu sois membre inscrit.
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 521
Au fait pour les tests de non appartenance à un ensemble, c'est pas NOT EXISTS mais NOT IN....
Ma requete finale et la tienne Kilian

$rq = "SELECT * FROM produits WHERE date_saisie>'$moins1' AND px>='10.00 AND NOT( px<30 AND date_saisie >= $six_mois")

J'ai juste enlevé un '_' apres le 1er px

Merci encore !