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 :

requete/jointure 'speciale' : est-ce possible ?


Sujet :

Requêtes MySQL

  1. #1
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut requete/jointure 'speciale' : est-ce possible ?
    Bonjour,
    J'ai une table avec des noms, une table avec des caracteristiques, et une table faisant la liaison entre les 2 (base de donnees normalisee).

    Je chercher a obtenir les noms avec la liste des carac qui leur correpondent. Un nom peut avoir aucune ou plusieurs carac, les noms n'ayant pas obligatoirement les memes carac ni le meme nombre de carac.

    Un ptit exemple :
    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
    test :
    +---------+-----------+
    | test_id | test_name |
    +---------+-----------+
    | 1       | toto      | 
    | 2       | titi      | 
    +---------+-----------+
     
    test2feature :
    +---------+------------+---------------+
    | test_id | feature_id | feature_value |
    +---------+------------+---------------+
    | 1       | 1          | rouge         | 
    | 2       | 1          | noir          | 
    | 2       | 2          | oui           | 
    +---------+------------+---------------+
     
    testfeature :
    +------------+--------------+
    | feature_id | feature_name |
    +------------+--------------+
    | 1          | voiture      | 
    | 2          | ballon       | 
    +------------+--------------+
    Et voici ce que je cherche a recuperer :
    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
    resultat recherche :
    +-----------+--------------+---------------+--------------+---------------+
    | test_name | feature_name | feature_value | feature_name | feature_value |
    +-----------+--------------+---------------+--------------+---------------+
    | toto      | voiture      | rouge         | voiture      | rouge         | 
    | titi      | voiture      | noir          | voiture      | rouge         | 
    +-----------+--------------+---------------+--------------+---------------+
     
    encore mieux :
    +-----------+---------+--------+
    | test_name | voiture | ballon |
    +-----------+---------+--------+
    | toto      | rouge   | NULL   | 
    | titi      | noir    | oui    | 
    +-----------+---------+--------+
    Le 2eme resultat est il possible ? Si oui comment ?
    Le cas echeant, qu'en est il du 1er ? Et comment ?

    Ce probleme me martelle le cranne depuis une ptite heure

    Merci de votre aide.
    Z.

  2. #2
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Bonjour,

    Je propose ceci (non testé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT test_name,
    (SELECT feature_name
    FROM test2feature
    INNER JOIN testfeature ON testfeature.feature_id = test2feature.feature_id
    WHERE test2feature.test_id = MAINTEST.test_id AND testfeature.feature_name = 'voiture') AS voiture,
    (SELECT feature_name
    FROM test2feature
    RIGHT JOIN testfeature ON testfeature.feature_id = test2feature.feature_id
    WHERE test2feature.test_id = MAINTEST.test_id AND testfeature.feature_name = 'ballon') AS ballon
    FROM test AS MAINTEST;
    Ce type de requête fait appel a des synchronisation de requête, c'est à dire que l'on récupère l'état d'une requête principale pour l'utiliser dans une sous requête.
    Ceci alourdi pas mal l'exécution...


    Il y a peut-être plus simple, mais je pense honnêtement que la conception des données devrais être autre. On pourrait t'aider a améliorer ça si tu nous expliquer ton contexte métier.

  3. #3
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    Superbe!

    J'ai teste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +-----------+---------+--------+
    | test_name | voiture | ballon |
    +-----------+---------+--------+
    | toto      | voiture | NULL   | 
    | titi      | voiture | ballon | 
    +-----------+---------+--------+
    Pour ce qui est de la lourdeur, jqu'en penses tu? :
    Ca sera tjrs moins lourd que de faire une requete pour chaque nom, pis via php, de recuperer les caracteristiques pour chacun, et les arranger ensemble dans 1 seul tableau, puis les afficher ?
    Z.

  4. #4
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Oui il est préférable de ne pas passer par php pour cela, cependant comme je disais, je pense qu'une meilleur conception pourrait allégé énormément la requête.

    Une petit erreur est présente dans ma requête, voici la corrigé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT test_name,
    (SELECT feature_value
    FROM test2feature
    INNER JOIN testfeature ON testfeature.feature_id = test2feature.feature_id
    WHERE test2feature.test_id = MAINTEST.test_id AND testfeature.feature_name = 'voiture') AS voiture,
    (SELECT feature_name
    FROM test2feature
    RIGHT JOIN testfeature ON testfeature.feature_id = test2feature.feature_id
    WHERE test2feature.test_id = MAINTEST.test_id AND testfeature.feature_name = 'ballon') AS ballon
    FROM test AS MAINTEST;

  5. #5
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    je ne peux pas l'ameliorer. Tout du moins, je ne vois pas comment faire. Je n'aurait plus une base de donnees normalisees, et donc les requetes seront moins effectives.
    Au final, les carac seront dynamique. il sera possible d'en rajouter. L'objectif final etant de pouvoir faire une recherche par nom, par intituler de caracteristique ou par valeur de caracteristique, et recuperer tous les infos de cette selection, nom et caracteristique.
    Je ne sais aps si je suis tres claire.

    Si tu as des conseils a me donner, je suis preneur, mais je ne crois pas avoir le choix.
    Ce probleme de caracteristiques m'a fait trourner en rond pas mal de temps : modelisation, puis ecriture des requetes pour ajouter des ellements. J'en suis aux requetes d'exploitation des resultats. (c'est une web application de gestion de donnees scientifiques)

    une fois de plus, merci
    Z.

  6. #6
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    J'ai regarder ta requete plus pres, et j'allais l'integrer a mon appli.
    Mais en faite, tu as selectionne arbitrairement ballon et voiture.
    Mes caracteristiques sont dynamique. Si par la suite, j'ajoute chaussure, maison, ou n'importe quel autre chose, ca ne fonctionne plus

    Z.

  7. #7
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Citation Envoyé par Zwiter Voir le message
    J'ai regarder ta requete plus pres, et j'allais l'integrer a mon appli.
    Mais en faite, tu as selectionne arbitrairement ballon et voiture.
    Mes caracteristiques sont dynamique. Si par la suite, j'ajoute chaussure, maison, ou n'importe quel autre chose, ca ne fonctionne plus

    Z.
    Ça deviens beaucoup plus compliqué la
    Je n'ai pas vraiment de solutions ...

  8. #8
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    Ya rien a faire, tant pour le 1er que pour le 2eme resultat?
    Mes tables sont donc correctent et respecte les lois de normalisation ?

  9. #9
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Citation Envoyé par Zwiter Voir le message
    Mes tables sont donc correctent et respecte les lois de normalisation ?
    Je veux bien t'aider a mieux concevoir ta base de données mais il va falloir nous donner les règles de gestion de ton application ...

  10. #10
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    ma solution actuelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT test_name, 
    group_concat(feature_id SEPARATOR ', ') AS f_id, 
    group_concat(feature_value SEPARATOR ', ') AS f_val
    FROM test
    NATURAL JOIN test2feature
    NATURAL JOIN testfeature
    GROUP BY test_id
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +-----------+------+-----------+
    | test_name | f_id | f_val     |
    +-----------+------+-----------+
    | toto      | 1    | rouge     | 
    | titi      | 1, 2 | noir, oui | 
    +-----------+------+-----------+
    Et quand je vais afficher ca avec php, je pourrai faire un split sur les champs f_id et f_val.
    Qu'en penses tu?

    Concernant les regles de gestion, je les ai deja cittees autrement. Il te faut qq chose de plus ?
    test_id -> test_name
    feature_id -> feature_name
    feature_id, test_id -> feature _value
    Z.

  11. #11
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Les règles de gestion sont la description de ton domaine de gestion devant apporter une information pour l'établissement des entités (ainsi que leurs contenus, des associations, ainsi que des cardinalitées).

    Pour ta solution elle est viable, mais on devrait théoriquement pouvoir se passe du code applicatif pour extraire les informations exploitables.

  12. #12
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    pas tout compris. Je vais proceder a 2-3 recherche sur le sujet.

    Une chosse est sure, concernant mon cas :
    A un nom j'ai aucune ou plusieurs carac.
    A une carac, j'ai aucun ou plusieurs nom.
    Et a chaque couple carac/nom correspond une valeur de carac, qui peut etre ou non unique.

    En 3FN (si je me suis bien renseigné), ca donne ce que j'ai ecrit plus haut :
    A (test_id, test_name [, ...])
    B (carac_id, carac_name)
    C (carac_id, test_id, carac_value)

    Je ne peux pas integrer carac_name a C car je perds l'information : une carac peut ne correspondre a aucun test_name.
    test_name ne peut etre integre a C car je perdrais d'une part la definition 'a un nom correspond aucune ou plusieurs carac', mais aussi, et je ne l'ai pas preciser, la relation A contient aussi d'autres informations 'fixent'.

    Z.

Discussions similaires

  1. integrer 2 requetes en une - est-ce possible
    Par yipikyer dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 01/02/2010, 14h59
  2. requete dans fonction est ce possible
    Par maxeur dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 26/01/2007, 11h21
  3. Réponses: 7
    Dernier message: 09/05/2006, 11h30
  4. Réponses: 5
    Dernier message: 28/04/2006, 09h20
  5. [debutant]Est-ce possible un tel resultat de requete???
    Par kenzo080 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/07/2005, 02h50

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