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 :

Stocker plusieurs données dans une seule colonne (utilisation du type non standard SET ?)


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 34
    Points : 25
    Points
    25
    Par défaut Stocker plusieurs données dans une seule colonne (utilisation du type non standard SET ?)
    Bonjour,

    J'ai besoin de stocker des langues associés à un spectacle. Ensuite je vais devoir effectuer des sélections assez complexe pour regrouper les spectacles ayant telle ou telle langue (ok dis comme ca c'est simple mais y a tout un algo qui fait que ca va être complexe et je veux que ce soit le plus basique possible).

    Solution 1:

    Créer une colonne par langue puis avec un état à 0 ou 1. Bien mais ca va obliger de trainer des conditions simples mais très longue avec des OR et des AND qui seront illisibles. De plus la structure de la table sera à modifier si on veut ajouter une langue.

    Solution 2:

    Utiliser le type de colonne SET. http://dev.mysql.com/doc/refman/5.0/fr/set.html
    Ca semble propre mais c'est pas standard du coup je vais galérer pour faire comprendre ça à mon framework zend. De plus, la structure de la table sera aussi à modifier si on ajoute une langue.

    Solution 3:

    Je fais une table d'association avec les langues etc. Surement la solution la plus propre mais qui complique quand même mon MCD pour pas grand chose.


    Solution 4:

    Du coup je cherche une autre solution. C'est très flou pour moi mais je pense qu'avec un champ varchar ou int je pourrais m'en sortir. Peut-être avec un calcule binaire et mettant en conf que la position 1 c'est FR, 10 c'est ES, 100 c'est EN, etc.

    Cependant ca n'est pas très clair pour moi si je cherche ensuite un spectacle FR et EN (et ES on s'en fiche) par exemple.


    Réponse :

    La solution est certainement la 3 ou la 4, sachant que je préfèrerais que ce soit la 4 mais je ne sais pas comment m'y prendre.

    Vous feriez comment à ma place ? Vous savez où je peux trouver de la doc sur la solution 4 ? D'autres pistes ?

  2. #2
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Bonjour,

    Si chaque spectacle à une et une seule langue, alors oui la bonne solution c'est d'ajouter une colonne.

    Après, sachant que les langues sont toutes contenus dans une liste finis, alors oui, créer toi une table, avec ID en clé primaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ID    -    Langue
    1           FR
    2     -    EN
    Et dans ta table tu mets la clé étrnagère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Spectacle_ID   -    Spectacle_Nom     -    Langue (INT)
    1                             MonSpectacle                1
    Après pour faire des requêtes, et obtenir tout les spectacle FR et EN, deux possiblités:
    1) tu es sur que la table des langues ne changent jamais, tu connais l'ID de la langue, et tu le mets en dur dans le code, mais pas de jointure (plus rapide) (Pas bien)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from spectacle where Langue IN (1,2)
    2) Code propre avec jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select * from spectacle s
    INNER JOIN Langue l
    ON s.Langue=l.ID AND l.Langue IN ('FR','EN')
    Ce qui fait que si les ID des langues changent, la requête marche quand même.
    L'utilisation du INNER, va faire que seul les spectacle dont la langue a été pré sélectionner dans la table langue vont s'afficher
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  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
    Oui pour la création d'une table des langues mais Gomoz disait :
    des langues associés à un spectacle
    La bonne solution à mettre en oeuvre est alors clairement la solution 3 : la table associative.

    sélections assez complexe pour regrouper les spectacles ayant telle ou telle langue
    Quels sont les spectacles en anglais ou en français ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT s.spc_id, s.spc_nom
    FROM spectacle s
    INNER JOIN spc_parler_lng spl ON spl.spl_id_spectacle = s.spc_id
    	INNER JOIN langue l ON l.lng_id = spc.spc_id_langue
    WHERE l.lng_code IN ('EN', 'FR')
    Quels sont les spectacles en anglais et en français ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT s.spc_id, s.spc_nom
    FROM spectacle s
    INNER JOIN spc_parler_lng spl ON spl.spl_id_spectacle = s.spc_id
    	INNER JOIN langue l ON l.lng_id = spc.spc_id_langue
    WHERE l.lng_code IN ('EN', 'FR')
    GROUP BY s.spc_id, s.spc_nom
    HAVING COUNT(spc.*) = 2
    Est-ce si compliqué ?
    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
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Ce qui est complexe, ce n'est pas ça mais les autres algos qui sont développés autour et dont je n'ai pas parlé. D'où l'idée d'avoir le truc le plus lisible possible ici pour pas m'embrouiller plus loin .

    Bon mais ok, je pars sur la table associative ce qui est classique et comme montré par CinePhil assez lisible puis pas le temps de chercher autre chose pour ce projet là.


    Pour ma culture je garde quand même la discussion ouverte. En particulier pour la solution n°4. Est-ce qu'on ne pourrait pas attribuer le chiffre 1 à FR, le chiffre 2 à EN et le chiffre 4 à ES et arriver via une opération à savoir si on a FR, EN ou ES (ou les juste deux). Instinctivement je pense que oui mais peut-être que j'ai tords.
    Vous voyez ce que je veux dire ?

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Oui c'est en effet possible. Notez que c'est exactement la même solution que votre S4, l'une étant en base-2 et l'autre en base-10 travaillant sur des puissances de deux.

    L'avantage de cette solution c'est que l'encodage est très simple, il suffit d'additionner tous les codes langues.
    Le problème c'est que l'opération contraire est plus compliquée.
    Soit vous faites une boucle while en partant de la plus grande valeur à coup de division euclidienne (donc pas en SQL mais dans votre application), soit vous utilisez la fonction BITAND mais qui ne répond qu'à une langue précise à la fois.

    Je vous invite à suivre la solution de Cinephil !

  6. #6
    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
    Citation Envoyé par Gomoz Voir le message
    Ce qui est complexe, ce n'est pas ça mais les autres algos qui sont développés autour et dont je n'ai pas parlé.
    Mais peut-être que ces algos sont simplifiables par une bonne requête SQL ?
    Il n'y a pas mieux qu'un SGBD pour traiter des données en masse sur une base enbsembliste.
    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 !

  7. #7
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Merci Waldar pour ce lien, c'est exactement ce que je voulais explorer avec la solution 4 et effectivement, on va en rester à la solution 3 même si je me garde la 4 pour d'autres situations.

    Autrement CinePhil c'est bien ce que j'espère pouvoir faire que d'utiliser le SGBD pour résoudre mon algo mais bon je vais pas vous demander de faire mon boulot (sauf si vous êtes sur Rennes, auquel cas, ma boite recrute).

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Rectification après réflexion je vais quand même utiliser la méthode 4 car ça me semble quand même pas idiot de supprimer une table et donc une jointure !

  9. #9
    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
    Rectification après réflexion je vais quand même utiliser la méthode 4 car ça me semble quand même pas idiot de supprimer une table et donc une jointure !
    Ce qui est idiot c'est de laisser une BDD non normalisée !
    Tu viens demander conseil, on te donne la bonne solution et tu fais quand même autre chose !
    Tu as vraiment envie qu'on t'aide ?

    Autrement CinePhil c'est bien ce que j'espère pouvoir faire que d'utiliser le SGBD pour résoudre mon algo mais bon je vais pas vous demander de faire mon boulot (sauf si vous êtes sur Rennes, auquel cas, ma boite recrute).
    C'est peut-être pour te remplacer que ta boîte recrute ?
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Probleme pour Concaténer plusieurs enregistrements dans une seule colonne
    Par severik dans le forum Requêtes et SQL.
    Réponses: 23
    Dernier message: 08/11/2017, 15h15
  2. Stocker plusieurs valeurs dans une seule colonne
    Par pitav dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/11/2014, 17h46
  3. [AC-2003] Concaténer plusieurs enregistrements dans une seule colonne
    Par pgomis dans le forum Access
    Réponses: 2
    Dernier message: 29/07/2013, 10h39
  4. Réponses: 11
    Dernier message: 31/01/2013, 10h56
  5. Réponses: 4
    Dernier message: 29/10/2010, 17h05

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