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

 MySQL Discussion :

Ordonner l'affichage des champs !? - Pb de requête...


Sujet :

MySQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 71
    Par défaut Ordonner l'affichage des champs !? - Pb de requête...
    Bonjour,

    Je débute dans la conception/gestion de bases de données, et je suis confronté à un problème :

    Soit une table comprenant les champs suivants : ID, Nom, Prenom, Adresse, Tel, Fax.

    Je souhaite afficher cette table sur mon site, avec la possibilité de faire un drag and drop sur chaque colonne afin de personnaliser l'affichage (si l'utilisateur desire que la premire colonne soit le Prenom et non le Nom par exemple...).

    Exemple ici :
    http://www.webresourcesdepot.com/wp-...querydragdrop/

    Dans cette exemple, ils font varier les lignes ce qui simplifie la conception étant donné que pour chaque entrée on peut rajouter un champ "ORDER" qui mémorise la position de la ligne.

    Ainsi pour chaque champ de la table citée ci-dessus, je souhaiterai leur attribuer une ou plusieurs variables permettant de mémoriser les préférences de l'utilisateur (Ordre des colonnes, certaines colonnes masquées ou non...).

    Quelle serait une solution à mon problème ?!

    Merci !

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Fredovsky Voir le message
    Ainsi pour chaque champ de la table citée ci-dessus, je souhaiterai leur attribuer une ou plusieurs variables permettant de mémoriser les préférences de l'utilisateur (Ordre des colonnes, certaines colonnes masquées ou non...).
    Si je comprends bien votre besoin, il faut mémoriser pour chaque utilisateur :
    - la colonne X est masquée ;
    - la colonne Y apparaît en position N.

    On aurait le schéma suivant :
    Utilisateur -0,n----Préférer----0,n- Colonne
    Paramètre -0,n---------|

    Avec l'association Préférer qui serait porteuse de la valeur du paramètre pour telle colonne et pour tel utilisateur.

    Ce qui donnerait les tables suivantes :
    Utilisateur (U_Id...)
    Colonne (C_Id, C_Libelle, C_Position_Par_Defaut...)
    Paramètre (P_Id, P_Libelle...)
    Preference (Pr_Id_Utilisateur, Pr_Id_Colonne, Pr_Id_Parametre, Pr_Valeur)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 71
    Par défaut
    En fait il faudrait que chaque colonne soit une table ?!

    Soit la table NOM :
    ID_Utilisateur, Position, Masquage, Valeur

    la table PRENOM :
    ID_Utilisateur, Position, Masquage, Valeur

    la table TELEPHONE :
    ID_Utilisateur, Position, Masquage, Valeur

    Etc.. etc... ?

    Ca rendrait la chose possible, mais lors d'une requête, il faudrait lancer la recherche dans pleins de tables differentes pour obtenir une ligne complète de résultat (=nom, prenom, adresse, fax...), avec du coup une redondance de la colonne ID_Utilisateur dans chaque table.

    Est-ce ce que tu me proposais ? car en fait je n'ai pas très bien compris ta réponse.

    Merci de m'eclaircir : )

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Fredovsky Voir le message
    En fait il faudrait que chaque colonne soit une table ?!
    Meuh non !
    Est-ce ce que tu me proposais ?
    Ben non !
    car en fait je n'ai pas très bien compris ta réponse.
    Effectivement !

    Alors je répète :
    Ce qui donnerait les tables suivantes :
    Utilisateur (U_Id...)
    Colonne (C_Id, C_Libelle, C_Position_Par_Defaut...)
    Paramètre (P_Id, P_Libelle...)
    Preference (Pr_Id_Utilisateur, Pr_Id_Colonne, Pr_Id_Parametre, Pr_Valeur)
    Et voici des exemples de données :
    Dans la table Utilisateur (U_Id...), U_Id est l'identifiant de l'utilisateur. Les autres colonnes possibles telles que U_Nom, U_Prenom... on s'en fout, on n'en a pas besoin pour l'exemple. Donc U_Id va de 1 à X.

    Dans la table Colonne (C_Id, C_Libelle, C_Position_Par_Defaut...), on pourrait avoir les données suivantes :
    1, 'Nom', 1
    2, 'Prenom', 2
    3, 'Telephone', 4
    4, 'Adresse', 3
    5, 'Date de naissance', 5

    Dans la table Paramètre (P_Id, P_Libelle...), on pourrait avoir les données suivantes :
    1, 'Masquage'
    2, 'Position'

    Dans la table Preference (Pr_Id_Utilisateur, Pr_Id_Colonne, Pr_Id_Parametre, Pr_Valeur), on pourrait avoir les données suivantes :
    1, 1, 2, 2
    1, 2, 2, 1
    2, 3, 2, 3
    2, 4, 2, 4
    2, 5, 1, 1

    Ce qui veut dire que l'utilisateur n° 1 veut la colonne n° 1 ('Nom') en position 2 et la colonne n° 2 ('Prénom') en position 1.
    Et que l'utilisateur n° 2 veut inverser les colonnes 'Téléphone' et 'Adresse' et masquer la colonne 'Date de naissance'.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 71
    Par défaut
    Je n'avais effectivement rien compris !!

    Tout s'éclaire, et ta méthode est évolutive (on peut ajouter autant de colonnes que l'on souhaite, et autant de paramètres différents) !

    Donc nickel, merci, car je n'arrivais pas à visualiser la solution correctement !

    A bientôt,

    Fred

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 71
    Par défaut
    Petite question pour faire les choses proprement :

    Je souhaite faire une requête et obtenir le résultat suivant :

    COL_ID | COL_LABEL | COL_POSITION | COL_VISIBLITY
    1----------Nom-------------2---------------1
    2----------Prenom----------1---------------1
    3----------Adresse----------3--------------0
    4----------Telephone-------4---------------1

    Avec COL_POSITION ayant pour valeur soit la position par défaut si l'utilisateur n'a pas défini de préférence, soit la position enregistrée dans la table Preference si celle-ci existe.

    J'ai pensé à faire 2 requêtes, l'une pour les positions par défaut, l'autre pour les préférences, et après mixer les deux en codant un truc en PHP mais je trouve ca assez moche comme méthode.

    Alors je cherche LA requete SQL me permettant d'avoir directement ce résultat, et donc directement exploitable sur mon site sans bidouiller.

    J'ai tenté des SELECT DISTINCT, des UNION, des CASE, des AN, bref, j'ai parcouru pas mal les différents opérateurs possibles, mais rien ne m'a permis de traduire la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT C_Id, C_Libelle, C_Position, C_Visibilite
    FROM Preference si lentrée existe WHERE Pr_Id_Utilisateur = id_user
    OR
    FROM Colonne si pas de preferences,
    et donc avec les valeurs par defaut (position par defaut, et visibilité à 1).
    Une petite piste peut-être ?!

    Merci !

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Tu peux essayer cette requête, pour l'utilisateur n° 1, en supposant que tu as pris mes valeurs pour les paramètres, et en supposant que la valeur par défaut du masquage est 0 (pas masqué).
    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 c.C_Id, c.C_Libelle,
      CASE 
        WHEN p2.Pr_Id_Colonne IS NULL THEN c.C_Position_Par_Defaut
        ELSE p2.Pr_Valeur
      END AS Position,
      CASE
        WHEN p1.Pr_Id_Colonne IS NULL THEN 0
        ELSE p1.Pr_Valeur
      END AS Masquage
    FROM Colonne AS c
    LEFT OUTER JOIN Preference AS p1 
      ON c.C_Id = p1.Pr_Id_Colonne 
      AND p1.Pr_Id_Parametre = 1
    LEFT OUTER JOIN Preference AS p2
      ON c.C_Id = p1.Pr_Id_Colonne 
      AND p2.Pr_Id_Parametre = 2
    WHERE p.Pr_Id_Utilisateur = 1
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 71
    Par défaut
    Salut,

    Je reviens un peu tard, examens oblige, et je me replonge donc dans mon projet.

    J'ai analysé ta requete, et après l'avoir déchiffrée, je me pose les questions suivantes :

    1/ Si p1 ne retourne rien (l'utilisateur n'a pas défini de masquage particulier), p2 ne trouve rien non plus (même si l'utilisateur a déplacé certaines colonnes), et il n'y a donc aucun résultats à la requete... ?

    2/ On n'utilise pas dans cette requête la table "Parametre", est-elle vraiment utile ? A quoi sert-t-elle si ce n'est à nous développeur nous rappeler quel ID correspond à quel paramètre ?

    3/ Enfin, à la dernière ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE p.Pr_Id_Utilisateur = 1
    p. n'est défini nulle part, j'ai déjoué en modifiant la requete ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (...)
    LEFT OUTER JOIN Preference AS p2
      ON c.C_Id = p1.Pr_Id_Colonne 
      AND p2.Pr_Id_Parametre = 2
      AND p2.Pr_Id_Utilisateur = p1.Pr_Id_Utilisateur
    WHERE p1.Pr_Id_Utilisateur = 1

    Est-ce une bonne méthode (c'est peut-être cette modification qui engendre le probleme de la question 1, je m'embrouille le cerveau avec les jointures !)

    Merci encore !

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 71
    Par défaut
    Bon j'ai réussi à trouver la bonne requete qui me donne le résultat voulu :

    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
    23
    24
    25
    26
     
    SELECT c.C_Id, c.C_Libelle,
      CASE 
        WHEN p2.Pr_Id_Colonne IS NULL THEN c.C_Position_Par_Defaut
        ELSE p2.Pr_Valeur
      END AS Position,
      CASE
        WHEN p1.Pr_Id_Colonne IS NULL THEN 0
        ELSE p1.Pr_Valeur
      END AS Masquage
    FROM Colonne AS c
     
    LEFT OUTER JOIN Colonne AS c1
      ON c1.C_ID = c.C_ID
     
    LEFT OUTER JOIN Preference AS p1 
      ON c1.C_Id = p1.Pr_Id_Colonne 
      AND p1.Pr_Id_Parametre = 1
      AND p1.Pr_Id_Utilisateur = 1
     
    LEFT OUTER JOIN Preference AS p2
      ON c1.C_Id = p2.Pr_Id_Colonne 
      AND p2.Pr_Id_Parametre = 2
      AND p2.Pr_Id_Utilisateur = 1
     
    ORDER BY Position ASC
    Reste la question 2/ qui m'intrigue :-)

    Merci encore !

Discussions similaires

  1. commander l'affichage des champs d'une requête depuis un formulaire
    Par nicoosito dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 31/07/2010, 13h53
  2. affichage des champs vides
    Par nada83 dans le forum Access
    Réponses: 5
    Dernier message: 02/05/2006, 15h33
  3. Liste des champs d'une requête
    Par Virgile59 dans le forum Access
    Réponses: 4
    Dernier message: 07/02/2006, 11h46
  4. [MySQL] Affichage des résultats d'un requête
    Par wiwi dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 07/02/2006, 11h25
  5. Réponses: 5
    Dernier message: 08/03/2005, 13h22

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