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

Requêtes MySQL Discussion :

Utilisez le contenu d'un champ en tant que nom de colonne pour une clause where !


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Utilisez le contenu d'un champ en tant que nom de colonne pour une clause where !
    Bonjour,

    Je souhaiterais utiliser le contenu d'un champ d'une table comme nom de colonne pour effectuer une recherche en requête SQL. Pour exemple :

    Table_1 :
    Nom du Champ, Contenu
    NOM , DUPONT
    GROUPE , GR1

    Table_2 :
    Nom du Champ, Contenu
    GR1 , 10
    GR2 , 20
    ...
    je voudrais trouver la valeur 10 avec le critère DUPONT ???
    Comment transcrire une valeur en nom de colonne !
    Merci d'avance

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Bien que les remarques afférentes à la validité de la modélisation qui a conduit à la création de cette table ne manqueraient pas, je me contenterais de rester dans la "logique" de la requête.
    D'où sortiraient les valeurs 10 et 20 ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  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 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Ce que Maljuna Kris veut dire par son allusion à la modélisation est que je déduis des données que tu indiques qu'il y a autant de colonnes que de groupes dans la Table_2, ce qui n'est pas bon car cela t'oblige à changer le modèle de données si tu ajoutes un groupe.

    Toujours d'après tes données, il semble que les règles de gestions soient :
    1) Une personne appartient à un groupe et un groupe peut accueillir plusieurs personnes.
    2) Un groupe a une "valeur numérique" (à déterminer sémantiquement, ce n'est pas précisé dans ton texte).

    De 1) on déduis qu'il y a une association entre les entités Personne et Groupe :
    Personne -1,1----Apartenir----0,n- Groupe

    De 2) on déduis que la "valeur numérique" est un attribut de l'entité Groupe.

    Les tables devraient donc être de la forme :
    Groupe (G_Id, G_Code, G_ValeurNum...)
    Personne (P_Id, P_IdGroupe, P_Nom...)

    Et il pourrait y avoir les valeurs suivantes.
    Table Groupe :
    G_Id / G_Code / G_ValeurNum
    1 / GR1 / 10
    2 / GR2 / 20
    ...

    Table Personne :
    P_Id / P_IdGroupe / P_Nom
    1 / 1 / DUPONT
    ...

    Maintenant ton besoin :
    je voudrais trouver la valeur 10 avec le critère DUPONT ?
    Facile avec une structure normalisée et une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT g.G_ValeurNum As ValeurGroupe
    FROM Personne AS p
    INNER JOIN Groupe As g ON p.P_IdGroupe = g.G_Id
    WHERE p.P_Nom = 'DUPONT'
    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
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonsoir, Merci pour la réponse. Notre besoin plus précis est le suivant et il va peut être justifier notre modélisation bizarre.

    Créer un filtre à partir du user en tenant compte des droits définis dans la table Tdoc par groupe

    Dans notre contexte (programmation imposée)
    Nous devons créer 3 requetes (0-1 et 2) sql par groupe soit dans le cas présent 9 profils. (0= pas visible / 1= lecture / 2= lecture-ecriture)
    nous voudrions ne créer que 3 requetes quelques soient le nombre de groupe.

    Notre solution est d'utiliser la valeur 'Tgroup.nom' soit 'compta' comme nom de column dans une requete !!! du genre

    Requete listant les docs en mode lecture/ecriture pour USER1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select  * from Tmain where Tmain.codedoc in
      (select tdoc.codedoc from Tdoc where
              (
              SELECT c.nom,b.nom FROM `model`.`tassogrpuser` a
              left outer join model.tuser b on idtuser=iduser
              left outer join model.tgroup c on idgroup=idtgroup
              where b.nom = 'user1'     {ce dernier select nous renvoie 'compta' que nous voudrions utiliser comme nom de colonne}
              ) = 2
       )
    Merci
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés

  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 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Euh... j'ai pas compris grand chose à ton dernier message.

    J'ai examiné la structure fournie en miniature...

    1) Il semble bien qu'il y ait une association entre tuser et tgroup, matérialisée par la table tassogrpuser qui est une table associative :
    tuser -0,n----Associer----0,n- tgroup
    Sauf qu'en ayant ajouté un identifiant artificiel à la table associative, ça autorise un user à faire partie plusieurs fois d'un groupe. C'est une source de doublons inutiles et donc un défaut de modélisation. La clé primaire de la table tassogrpuser devrait être composée de idUser et de idGroup.

    2) De même, il y a une association entre tclient et tdoc matérialisée par la table tmain (pourquoi ce nom ? ).
    tdoc -0,n----Associer----0,n- tclient
    Là aussi, l'identifiant artificiel idTmain est inutile et autorise les doublons dans la table tmain.

    Créer un filtre à partir du user en tenant compte des droits définis dans la table Tdoc par groupe
    ...
    Nous devons créer 3 requetes (0-1 et 2) sql par groupe soit dans le cas présent 9 profils. (0= pas visible / 1= lecture / 2= lecture-ecriture)
    nous voudrions ne créer que 3 requetes quelques soient le nombre de groupe.
    Ce que je comprends :
    Il y a des droits de visibilité, lecture, écriture sur les documents selon les groupes.

    Traduisons cela en règles de gestion :
    Un groupe peut accéder à plusieurs documents avec certains droits.
    Un document peut être accédé par plusieurs groupes selon certains droits.
    Un droit peut s'appliquer à plusieurs documents pour certains groupes.

    Le triplet (document, groupe, droit) a donc une contrainte d'unicité puisque les droits sont cumulatifs (celui qui peut écrire peut lire).

    Il y a dons une association ternaire entre les trois entités :
    Groupe -0,n----Accéder----0,n- Document
    Droit -0,n------------|

    Ce qui donne les tables :
    tgroup (idTgroup, nom)
    tdoc (idTdoc, codedoc)
    tdroit (idDroit, libelle, valeur)
    taccesdocgrp (idDoc, idGroupe, idDroit)

    Quels sont les documents auxquels j'ai accès et avec quels droits ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT doc.codedoc, dr.libelle
    FROM taccesdocgrp AS a
    INNER JOIN tdoc AS doc ON a.idDoc = doc.idTdoc
    INNER JOIN tdroit AS dr ON a.idDroit = dr.idTdroit
    INNER JOIN tgroup AS g ON a.idGroup = g.idtgroup
      INNER JOIN tassogrpuser AS gu ON g.idTgroup = gu.idGroup
        INNER JOIN tuser AS u ON gu.idUser = u.idtuser
    WHERE u.nom = 'Philippe Leménager'
    Et ça marche dans tous les sens quels que soient le nombre de groupes, d'utilisateurs, de documents et de droits.
    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. Variable en tant que nom de colonne requête SQL
    Par hugoclo dans le forum Langage
    Réponses: 12
    Dernier message: 07/03/2014, 22h32
  2. Réponses: 2
    Dernier message: 22/02/2013, 17h12
  3. Définir le contenu d'un fichier en tant que variable
    Par yoyo-tns dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 04/12/2012, 09h34
  4. Réponses: 0
    Dernier message: 15/06/2010, 16h29
  5. Mettre à jour un champ Boolean avec une clause "WHERE"
    Par niano dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 02/10/2007, 11h29

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