[PHP] Requete SQL

Résolu
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. 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
    1. 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')
      1. 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,
        1. Contributeur
          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.
          1. Modérateur
            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. Elle est pas mal aussi comme ça !
          2. 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. 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,
              1. Modérateur
                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.
                1. Modérateur
                  Au fait pour les tests de non appartenance à un ensemble, c'est pas NOT EXISTS mais NOT IN....
                  1. 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 !