Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/10/2011, 11h46   #1
Nouveau Membre du Club
 
Inscription : octobre 2007
Messages : 89
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 89
Points : 31
Points : 31
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
.
.
bilcosby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 12h03   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Combien d'items différents par ref ?
Code :
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 :
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 :
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
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 12h12   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 434
Points : 10 434
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Un peu plus simple :
Code :
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.
__________________
Email : http://scr.im/waldar
Waldar est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 15h16   #4
Nouveau Membre du Club
 
Inscription : octobre 2007
Messages : 89
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 89
Points : 31
Points : 31
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 :
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 :
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 :
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 :
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 :
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 =>
.
bilcosby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 22h07   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
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.

Citation:
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 :
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
)
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h05.


 
 
 
 
Partenaires

Hébergement Web