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 :

Comparer deux listes dans deux tables


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 18
    Points : 5
    Points
    5
    Par défaut Comparer deux listes dans deux tables
    Voici le problème que j'ai:
    Un lot est composé de plusieurs phases, l'état du lot sera changé en "receptionner" quand toutes les phases liées à cet lot sont validées. Donc si on résume il nous faut une requête qui vérifie l'état de toutes les phases affectées à un lot sont validées.
    la forme du table lot est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE `lot` (
      `Appel_offre_reference` int(11) NOT NULL,
      `Lot_reference` int(11) NOT NULL,
      `Marche_reference` int(11) default NULL,
      `Lot_libelle` varchar(254) default NULL,
      `Lot_etat` varchar(254) default 'non receptionner',
      PRIMARY KEY  (`Appel_offre_reference`,`Lot_reference`),
      KEY `FK_lot_marche` (`Marche_reference`),
      CONSTRAINT `FK_appelOffre_lot` FOREIGN KEY (`Appel_offre_reference`) REFERENCES `appeloffre` (`Appel_offre_reference`),
      CONSTRAINT `FK_lot_marche` FOREIGN KEY (`Marche_reference`) REFERENCES `marche` (`Marche_reference`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    et la forme de la Table Phase:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE `phase` (
      `Appel_offre_reference` int(11) NOT NULL,
      `Lot_reference` int(11) NOT NULL,
      `Phase_reference` int(11) NOT NULL,
      `Reglement_type_operation_financiere` varchar(254) default NULL,
      `Phase_libelle` varchar(254) default NULL,
      `Phase_etat` varchar(254) default 'non valider',
      PRIMARY KEY  (`Appel_offre_reference`,`Lot_reference`,`Phase_reference`),
      KEY `FK_phase_reglement` (`Reglement_type_operation_financiere`),
      CONSTRAINT `FK_lot_phase` FOREIGN KEY (`Appel_offre_reference`, `Lot_reference`) REFERENCES `lot` (`Appel_offre_reference`, `Lot_reference`),
      CONSTRAINT `FK_phase_reglement` FOREIGN KEY (`Reglement_type_operation_financiere`) REFERENCES `reglement` (`Reglement_type_operation_financiere`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

  2. #2
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Bonjour,

    Peut-tu nous préciser ton SGBD ?
    Et nous mettre ton ébauche de requête ?

    Par contre je n'ai pas trop compris ta problèmatique :
    - tu veux afficher seulement les phases dont tous les lots sont "receptionner" ?
    - tu veux voir les états de tous les lots de toutes tes phases ?
    - autre chose ?
    ~ Lola ~

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Tu as essayé une requête avant de nous demander de faire ton travail ?

    Un lot est composé de plusieurs phases, l'état du lot sera changé en "receptionner" quand toutes les phases liées à cet lot sont validées. Donc si on résume il nous faut une requête qui vérifie l'état de toutes les phases affectées à un lot sont validées.
    Il faut donc comparer le nombre de phases d'un lot et le nombre de phases validées de ce même lot.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 18
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par lola06 Voir le message
    Bonjour,

    Peut-tu nous préciser ton SGBD ?

    Par contre je n'ai pas trop compris ta problèmatique :
    - tu veux afficher seulement les phases dont tous les lots sont "receptionner" ?
    - tu veux voir les états de tous les lots de toutes tes phases ?
    - autre chose ?
    J'utilise SQL comme SGBD.
    je veux vérifier si la liste des phases qui appartient à un lot sont toutes validées pour qu'on puisse dire après un lot est réceptionné avec toutes ses phases validées


    Citation Envoyé par CinePhil Voir le message
    Tu as essayé une requête avant de nous demander de faire ton travail ?

    Citation:
    Un lot est composé de plusieurs phases, l'état du lot sera changé en "receptionner" quand toutes les phases liées à cet lot sont validées. Donc si on résume il nous faut une requête qui vérifie l'état de toutes les phases affectées à un lot sont validées.
    Il faut donc comparer le nombre de phases d'un lot et le nombre de phases validées de ce même lot.
    Oui c'est exactement ça pour savoir si les phases de ce lot sont toutes validées ou pas.

    Citation Envoyé par lola06 Voir le message
    Et nous mettre ton ébauche de requête ?
    Citation Envoyé par CinePhil Voir le message
    Tu as essayé une requête avant de nous demander de faire ton travail ?
    Oui j'ai essayé de faire un essai en raisonnant de chercher les phases validées qui appartiennent à un lot donné et de la comparer à la liste des phases d'un lot donné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM LOT lot WHERE lot.id IN {SELECT * FROM LOT lot LEFT JOIN PHASE phase 
    WHERE phase.Phase_reference=lot.id AND phase.Phase_etat ALL IN {SELECT * FROM PHASE ph WHERE ph.Phase_etat='valider'}};

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    J'utilise SQL comme un SGBD.
    SQL est un langage, objet de ce forum.

    On te demande quel est ton SGBD (système de gestion de bases de données). Par exemple, Postgresql, Microsoft SQL Server, Oracle, IBM DB2, MySQL...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM LOT lot WHERE lot.id IN {SELECT * FROM LOT lot LEFT JOIN PHASE phase 
    WHERE phase.Phase_reference=lot.id AND phase.Phase_etat ALL IN {SELECT * FROM PHASE ph WHERE ph.Phase_etat='valider'}};
    Euh...
    Toi tu as besoin de cours en SQL !

    Jamais vu d'accolades dans une requête SQL ! Peut-être est-ce une syntaxe particulière de ton SGBD ?

    WHERE lot.id IN {SELECT * ne peut pas fonctionner car tu compares la valeur d'une colonne (lot.id) à un ensemble de colonnes (*) !

    Il y aurait encore pas mal de choses à dire sur la requête mais j'ai autre chose à faire...

    Combien de phases pour le lot 1 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COUNT(*) AS nb_phases
    FROM phase
    WHERE Phase_reference = 1
    Combien de phases validées pour le lot 1 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(*) AS nb_phases_validees
    FROM phase
    WHERE Phase_reference = 1
    	AND Phase_etat = 'valider'
    Bonjour la faute au passage ! "valider" est un verbe, pas un adjectif. Et il serait préférable de ne pas répéter ce terme dans de nombreuses lignes de la table mais de faire référence à une table des états.

    Combien de phases par lot ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Phase_reference AS id_lot, 
    	COUNT(*) AS nb_phase
    FROM phase
    GROUP BY Phase_reference
    Combien de phases validées par lot ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Phase_reference AS id_lot, 
    	COUNT(*) AS nb_phase
    FROM phase
    WHERE Phase_etat = 'valider'
    GROUP BY Phase_reference
    Quels sont les lots qui ont toutes leurs phases validées ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT p1.Phase_reference AS id_lot, 
    	COUNT(p1.*) AS nb_phase
    FROM phase p1
    WHERE p1.Phase_etat = 'valider'
    GROUP BY p1.Phase_reference
    HAVING COUNT(p1.*) = 
    (
    	SELECT COUNT(p2.*)
    	FROM phase p2
    	WHERE p2.Phase_reference = p1.Phase_reference
    )
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 18
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    SQL est un langage, objet de ce forum.

    On te demande quel est ton SGBD (système de gestion de bases de données). Par exemple, Postgresql, Microsoft SQL Server, Oracle, IBM DB2, MySQL..
    Désolé je veux bien dire MySQL

    Citation Envoyé par CinePhil Voir le message
    Euh...
    Toi tu as besoin de cours en SQL !
    Je confirme que j'ai oublié des notions de base en SQL, surtout dans ma requête je n'ai pas pu montrer la comparaison d'une liste à une autre enfin c'est ma question dans ce post

    Citation Envoyé par CinePhil Voir le message
    Jamais vu d'accolades dans une requête SQL ! Peut-être est-ce une syntaxe particulière de ton SGBD ?

    WHERE lot.id IN {SELECT * ne peut pas fonctionner car tu compares la valeur d'une colonne (lot.id) à un ensemble de colonnes (*) !

    Il y aurait encore pas mal de choses à dire sur la requête mais j'ai autre chose à faire...
    Tu as raison pour les accolades mais je les utilisais au lieu des parenthèses pour mieux expliquer le code mais apparemment j'ai fait le contraire

    Citation Envoyé par CinePhil Voir le message
    Combien de phases pour le lot 1 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COUNT(*) AS nb_phases
    FROM phase
    WHERE Phase_reference = 1
    Combien de phases validées pour le lot 1 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(*) AS nb_phases_validees
    FROM phase
    WHERE Phase_reference = 1
    	AND Phase_etat = 'valider'
    Bonjour la faute au passage ! "valider" est un verbe, pas un adjectif. Et il serait préférable de ne pas répéter ce terme dans de nombreuses lignes de la table mais de faire référence à une table des états.
    J'ai utilisé un verbe et pas un adjectif parce que à la base de donnée j'ai eu des problèmes en mettant "validé" et pas la peine d'une Table des états vu que c'est juste un champ pour vérifier l'état du lot ou de la phase concernée.
    Citation Envoyé par CinePhil Voir le message
    Combien de phases par lot ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Phase_reference AS id_lot, 
    	COUNT(*) AS nb_phase
    FROM phase
    GROUP BY Phase_reference
    Combien de phases validées par lot ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Phase_reference AS id_lot, 
    	COUNT(*) AS nb_phase
    FROM phase
    WHERE Phase_etat = 'valider'
    GROUP BY Phase_reference
    Quels sont les lots qui ont toutes leurs phases validées ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT p1.Phase_reference AS id_lot, 
    	COUNT(p1.*) AS nb_phase
    FROM phase p1
    WHERE p1.Phase_etat = 'valider'
    GROUP BY p1.Phase_reference
    HAVING COUNT(p1.*) = 
    (
    	SELECT COUNT(p2.*)
    	FROM phase p2
    	WHERE p2.Phase_reference = p1.Phase_reference
    )
    Merci bien pour les idées, je vous informe pour le résultat

  7. #7
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par djongar Voir le message
    J'ai utiliser un verbe et pas un adjectif parce que à la base de donnée j'ai eu des problèmes en mettant "validé" et pas la peine d'une Table des états vu que c'est juste un champ pour vérifier l'état du lot ou de la phase concernée.
    Dans ce cas pourquoi ne pas utilisé le nom, parce que CinePhil a raison ça fait vraiment mal aux yeux !!

    - valider / ? non valider ? -----> valide / invalide
    - non receptionner / receptionner -----> reception KO / reception OK

    Pourquoi tu ne veux pas construire une table des états ? D'autant plus que si tu l'utilise dans une requête un peu lourde, le fait de requêter sur un ID est bien moins gourmand que sur un texte.
    ~ Lola ~

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    L'externalisation des données de référence fait partie des bonnes pratiques de modélisation des données.

    La table des états est jusitifée s'il y a plusieurs états (commande reçue, chantier programmé, en cours, terminé, réceptionné, réserves levées, validé).

    Au passage, je ne vois pas pourquoi une colonne de type VARCHAR refuserait des lettres accentuées ! C'est peut-être plutôt un problème de compatibilité CHARSET entre la table SQL et la page HTML.

    Si par contre, la colonne ne sert qu'à dire si une phase est validée ou non, un type BOOLEAN serait suffisant.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

Discussions similaires

  1. [AC-2003] Comparer deux champs dans une table et remplir un autre champ
    Par frexville dans le forum VBA Access
    Réponses: 3
    Dernier message: 07/09/2009, 12h52
  2. calcul entre deux champs dans une table
    Par pomar dans le forum Access
    Réponses: 7
    Dernier message: 29/11/2006, 18h27
  3. Comparaison entre deux dates dans une table
    Par Biskot75 dans le forum Access
    Réponses: 6
    Dernier message: 19/09/2006, 11h16
  4. Lier deux champs dans deux tables ?
    Par Olivierc dans le forum Access
    Réponses: 3
    Dernier message: 28/04/2006, 23h13
  5. [css]problème d'attribution de classe dans deux listes
    Par Mitaka dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 24/11/2005, 18h05

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