[PHP] Requete SQL

Résolu
Laeticia -  
 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,
Configuration: Windows Vista
Opera 9.22

10 réponses

  1. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    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
    1. Chacual Messages postés 230 Statut Membre 150
       
      Elle est pas mal aussi comme ça !
      0
  2. xenogears
     
    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.
    1
  3. xenogears
     
    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
    0
  4. Chacual Messages postés 230 Statut Membre 150
     
    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')
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Laeticia
     
    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,
    0
  7. kij_82 Messages postés 4102 Date d'inscription   Statut Contributeur Dernière intervention   857
     
    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.
    0
  8. Laeticia
     
    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,
    0
  9. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    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.
    0
  10. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    Au fait pour les tests de non appartenance à un ensemble, c'est pas NOT EXISTS mais NOT IN....
    0
  11. Laeticia
     
    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 !
    0