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 10/02/2011, 15h32   #1
Nouveau Membre du Club
 
Inscription : octobre 2004
Messages : 126
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 126
Points : 30
Points : 30
Par défaut Insert de valeur dépendant d'un test sur booléen

Bonjour à tous,

Une des applications sur laquelle je travaille doit remplir une table en fonction de ce que contient une autre table. Je m'explique.

Soit ma table: buildresult
Code :
1
2
3
4
5
6
7
CREATE  TABLE IF NOT EXISTS `dashboardv3`.`buildresult` (
  `id_buildresult` INT NOT NULL AUTO_INCREMENT ,
  `date` DATETIME NOT NULL ,
  `result` TINYINT(1)  NOT NULL ,
  `id_caterror` INT NOT NULL ,
  `id_subcaterror` INT NOT NULL ,
  `id_build` INT NOT NULL)
et ma table build
Code :
1
2
3
4
5
6
7
8
CREATE  TABLE IF NOT EXISTS `dashboardv3`.`build` (
  `id_build` INT NOT NULL AUTO_INCREMENT ,
  `date` DATETIME NOT NULL ,
  `result` TINYINT(1)  NULL ,
  `buildnumber` INT NOT NULL ,
  `id_caterror` INT NULL ,
  `id_release` INT NOT NULL ,
  `id_purpose` INT NOT NULL )
Ma table buildresult contient des informations que je dois vérifier afin d'insérer un résultat dans la table build.

Pour être plus précis, le champ result de la table build doit être à true si plusieurs des entrées dans la table buildresult sont à true. Et à false si au moins une des entrées de la table buildresult est à false.

Ma question: est il possible dans une requête SQL de tester la valeur pour la colonne de plusieurs entrée et en fonction de ce test, inserer une valeur dans une autre table.

Je m'excuse par avance, j'ai du mal à exprimer clairement mes problématiques SQL...
Remedy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 15h39   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 992
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 : 10 992
Points : 18 243
Points : 18 243
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Remedy Voir le message
Pour être plus précis, le champ result de la table build doit être à true si plusieurs des entrées dans la table buildresult sont à true. Et à false si au moins une des entrées de la table buildresult est à false.
Quel regroupement de colonnes de buildresult va déterminer le comptage du nombre de lignes où result serait à TRUE ?

Citation:
Ma question: est il possible dans une requête SQL de tester la valeur pour la colonne de plusieurs entrée et en fonction de ce test, inserer une valeur dans une autre table.
Oui par un GROUP BY, un COUNT(*), une condition sur result dans le WHERE et un HAVING sur le COUNT(*).

Commence par construire une requête SELECT avec ça pour vérifier si le résultat retourné est bon puis mets le SELECT dans une requête INSERT.
__________________
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 10/02/2011, 15h47   #3
Nouveau Membre du Club
 
Inscription : octobre 2004
Messages : 126
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 126
Points : 30
Points : 30
En fait, je dois récupérer tous les enregistrements de la table buildresult dont l'id_build est égal à l'id de l'enregistrement à modifier dans la table build.

Sur ces enregistrements, je dois vérifier les valeurs result et faire comme je l'ai dit dans mon premier message: mettre build.result à true si tous les buildresult.result sont à true, ou à false si au moins un des buildresult.result est false.
Remedy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 15h55   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 992
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 : 10 992
Points : 18 243
Points : 18 243
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Remedy Voir le message
En fait, je dois récupérer tous les enregistrements de la table buildresult dont l'id_build est égal à l'id de l'enregistrement à modifier dans la table build.
Dans ton premier message, tu parlais d'insérer !

Citation:
Sur ces enregistrements, je dois vérifier les valeurs result et faire comme je l'ai dit dans mon premier message: mettre build.result à true si tous les buildresult.result sont à true, ou à false si au moins un des buildresult.result est false.
J'ai encore du mal à comprendre...
Tu veux dire que si tu as au moins un buildresult.result à false dans l'ensemble des lignes de la table dont l'id est aussi dans la table build, tu vas mettre tous les build.result de ces lignes à false, sinon tous à true ?
__________________
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 10/02/2011, 16h05   #5
Nouveau Membre du Club
 
Inscription : octobre 2004
Messages : 126
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 126
Points : 30
Points : 30
Citation:
Envoyé par CinePhil Voir le message
Dans ton premier message, tu parlais d'insérer !
pardon, je dois en fait faire un update...

Citation:
Envoyé par CinePhil Voir le message
J'ai encore du mal à comprendre...
Tu veux dire que si tu as au moins un buildresult.result à false dans l'ensemble des lignes de la table dont l'id est aussi dans la table build, tu vas mettre tous les build.result de ces lignes à false, sinon tous à true ?
Presque pour une entrée dans la table build correspond 0 à n entrée(s) dans la table buildresult (liaison par build.id_build et buildresult.id_build). Dans mon application, à un certain moment, je suis sur une entrée de la table build, et il faut que je renseigne le champ result de cette entrée.
Pour cela il faut que je retrouve les entrées de la table buildresult qui sont reliées à l'entrée de la table build. Et le champ build.result dépendera de la combinaison des champs buildresult.result de l'ensemble des entrées récupérees (donc qui matchent l'entrée de la table build.)
Remedy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 16h28   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 992
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 : 10 992
Points : 18 243
Points : 18 243
Envoyer un message via MSN à CinePhil
Je pense avoir compris...

Combien de result FALSE pour chaque id_buildresult ?
Code :
1
2
3
4
5
6
7
SELECT id_buildresult, 
    SUM(CASE 
        WHEN result = 0 THEN 1 
        ELSE 0 
    END) AS nb_false
FROM buildresult
GROUP BY id_buildresult
=> L'idée est ici d'additionner des 1 chaque fois que result est false pour un id_buildresult.

Pour savoir quelles lignes sont à mettre à jour dans build, on fait une jointure avec la requête précédente :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT b.id_build
FROM build b
INNER JOIN
(
    SELECT id_buildresult, 
        SUM(CASE 
            WHEN result = 0 THEN 1 
            ELSE 0 
        END) AS nb_false
    FROM buildresult
    GROUP BY id_buildresult
) br ON br.id_buildresult = b.id_build
On adapte la requête précédente en UPDATE :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
UPDATE build b
INNER JOIN
(
    SELECT id_buildresult, 
        SUM(CASE 
            WHEN result = 0 THEN 1 
            ELSE 0 
        END) AS nb_false
    FROM buildresult
    GROUP BY id_buildresult
) br ON br.id_buildresult = b.id_build
SET b.result = 
    CASE 
        WHEN br.nb_false > 0 THEN 0
        ELSE 1
    END
Essaie d'abord sur une table test.
__________________
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 10/02/2011, 18h14   #7
Nouveau Membre du Club
 
Inscription : octobre 2004
Messages : 126
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 126
Points : 30
Points : 30
Merci pour ton aide, ça fonctionne presque mais maintenant que tu m'as montré le chemin je souhaite chercher par moi même
Remedy 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 11h54.


 
 
 
 
Partenaires

Hébergement Web