IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requête dans requête !


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 209
    Points : 115
    Points
    115
    Par défaut Requête dans requête !
    Bonjour à tous
    N'étant pas assez doué en sql, je bloque sur ce souci :



    je dois tester si la REF(test1-000) est conforme, pour cela il faut que tout les ITEM en rapport avec la REF soit eux aussi "conforme" au moins une fois.
    On peut constater que l'ITEM "PV es.tenue sous pression" est présente 3 fois, mais une seule ligne est validée "CONFORME".(Donc elle est ok je ne reviendrais pas dessus..)
    Les deux autres ITEM, ne l'étant pas, la REF(test1-000) ne peut pas être validée comme "CONFORME".

    si tout les ITEM sont une fois conforme, j' UPDATE sur une autre table pour valider la REF. (Ça je sais le faire.....)
    ..

    Je voudrais éviter des requête imbriquées avec des foreach partout..Je pense qu'il y a moyen de le faire en sur seule ligne

    J'espère être clair....

    Merci de votre aide
    .
    .

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Combien d'items différents par ref ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ref, 
    	COUNT(DISTINCT item) AS nb_items
    FROM la_table
    GROUP BY ref
    Combien d'items conformes par ref ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ref, 
    	COUNT(DISTINCT item) AS nb_items_conformes
    FROM la_table
    WHERE conclusion = 'CONFORME'
    GROUP BY ref
    On ne retient que les ref dont les deux nombres sont égaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT t1.ref
    FROM 
    (
    	SELECT ref, 
    		COUNT(DISTINCT item) AS nb_items_conformes
    	FROM la_table
    	WHERE conclusion = 'CONFORME'
    	GROUP BY ref
    ) t1
    INNER JOIN
    (
    	SELECT ref, 
    	COUNT(DISTINCT item) AS nb_items
    	FROM la_table
    	GROUP BY ref
    ) t2 ON t2.ref = t1.ref
    WHERE t1.nb_items_conformes = t2.nb_items

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Un peu plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      select ref
           , case count(*) when sum(conclusion) then 'CONFORME' end as conclusion
        from  (select ref, item
                    , count(distinct conclusion) as conclusion
                 from MaTable
             group by ref, item) sr
    group by ref
    En l'état cette requête ne fonctionne qu'avec la valeur CONFORME dans la colonne conclusion, si ce n'est pas le cas il faut rajouter un CASE WHEN dans le count distinct.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 209
    Points : 115
    Points
    115
    Par défaut
    Merci à vous deux
    J'avais trouvé le début, façon Cinephil.
    Par contre j'ai du mal à comprendre la dernière requête !
    j'ai donc fait :

    Connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try
     {
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=localhost;dbname=basedonnee', 'login', 'pass', $pdo_options);
    }
    catch (Exception $e){ die('Erreur : ' . $e->getMessage());	  }
    je récupère la REF :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $sql = "SELECT `ref` FROM `ficheMAJ`";
    $result1 = $bdd->query($sql);
    $resultat1=$result1->fetchAll(PDO::FETCH_ASSOC);
    foreach ($resultat1 as $row1) 
    {
    $ref=$row1['ref'];
    Je test le nombre ITEM par REF :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $sql = "SELECT COUNT(DISTINCT item ) AS 'nbritem' FROM `tableau` WHERE `ref`='$ref'";
    $resultat2 = $bdd->query($sql);
    $columns1 = $resultat2->fetch();
    Je test le nombre ITEM conforme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $sql = "SELECT ref,	COUNT(DISTINCT item) AS 'nbritemconf' 	FROM `tableau` WHERE conclusion = 'CONFORME' GROUP BY ref";
    $resultat3 = $bdd->query($sql);
    $columns2 = $resultat3->fetch();
    Je compare et j'UPDATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    if ($columns1['nbritem']==$columns2['nbritemconf'])
    { 
    $bdd->exec('UPDATE `iprsfr`.`fiche` SET `conclusion` = "CONFORME"  WHERE `fiche`.`ref` = "'.$ref.'"');
    }
    De cette façon ça à l'air de fonctionner.

    Quant au script de Waldar, c'est un peu ce que je pensais en postant ce message, mais j'avoue ne pas comprendre le déroulement de cette requête, donc je préfère m'abstenir. Mais je la garde sous le coude pour la décortiquer..

    Merci de votre aide et à bientôt......

    PS: j'inclus le code php, pour ceux qui comme moi, regardent les requêtes sql hors contexte, en faisant cette tête =>
    .

  5. #5
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par bilcosby Voir le message
    Merci à vous deux
    J'avais trouvé le début, façon Cinephil.
    Par contre j'ai du mal à comprendre la dernière requête !
    Tu parles de ma dernière requête ou de celle de Waldar ?
    Je me suis contenté de faire une jointure entre les deux premières requêtes pour comparer les résultats.

    j'ai donc fait :
    ... 4 requêtes au lieu d'une et un parcours de résultat avec autant de requêtes UPDATE qu'il y a de ref à traiter !

    L'UPDATE en une seule requête qui utilise ma dernière requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    UPDATE fiche
    SET conclusion = 'CONFORME'
    WHERE ref IN
    (
    	SELECT t1.ref
    	FROM 
    	(
    		SELECT ref, 
    			COUNT(DISTINCT item) AS nb_items_conformes
    		FROM la_table
    		WHERE conclusion = 'CONFORME'
    		GROUP BY ref
    	) t1
    	INNER JOIN
    	(
    		SELECT ref, 
    		COUNT(DISTINCT item) AS nb_items
    		FROM la_table
    		GROUP BY ref
    	) t2 ON t2.ref = t1.ref
    	WHERE t1.nb_items_conformes = t2.nb_items
    )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Soucis, requête dans requête
    Par jedijul dans le forum Requêtes
    Réponses: 1
    Dernier message: 04/07/2011, 14h05
  2. Réponses: 3
    Dernier message: 29/03/2009, 23h40
  3. résultat requête dans requête MAJ
    Par rasta girl dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 01/07/2008, 00h00
  4. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 19h02
  5. Regrouper 3 requêtes dans une seule
    Par LadyArwen dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/06/2003, 10h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo