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 :

jointure sur 3 tables


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut jointure sur 3 tables
    Bonjour;
    j'ai un petit problème avec une requitte mysql (qui 3 jointure ), donc je me trouve perdu dans vague.
    alors j'ai 3 table:
    catalog_product_entity_varchar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    value_id                 int(11)          Identity
    entity_type_id        mediumint(8)   not null
    attribute_id           smallint(5       not null
    store_id                smallint(5       not null
    entity_id               int(10)           not null
    value                   varchar(255)    not null
    catalog_product_entity
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    entity_id     int(10)             identity
    entity_type_id       smallint(8)        not null
    attribute_set_id     smallint(5)        not null   
    type_id                varchar(32)       not null
    sku                      varchar(64)      null
    category_ids         text                 null
    created_at           datetime           not null
    updated_at          datetime           not null
    has_options         smallint(1)         not null
    catalog_category_product
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    category_id               int(10)       not null
    product_id               int(10)           not null
    position                 int(10)           not null
    alors je veux afficher entity_id et value qui on l'attribute_id= 56,70 de la table catalog_product_entity_varchar. jusqu'au là pas de problème.
    maintenant je veux joindre (catalog_product_entity_varchar avec catalog_product_entity dans entity_id) et les joindre avec catalog_category_product dans catalog_category_product.product_id = catalog_product_entity.entity_id. voilà ce que j'ai fait (je sais que des bêtises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT catalog_product_entity_varchar.entity_id,
      catalog_product_entity_varchar.value  
    from catalog_product_entity_varchar 
    inner join catalog_product_entity on
      catalog_product_entity.entity_id=catalog_product_entity_varchar.entity_id
     inner join catalog_category_product on 
    catalog_category_product.product_id = catalog_product_entity.entity_id where  catalog_category_product.category_id=18 and 
      catalog_product_entity_varchar.attribute_id in(56,70)
    j'ai eu comme résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    entity_id         .                           value
    4               .                  PALM PALM PDA TX Handheld
    4               .                  /P/A/PALM-TX__new.jpg
    5               .                 HP HP iPAQ 114 CLASSIC HANDHELD
    5               .                /F/A/FA982AA.jpg
    6               .                PALM PALM Z22 Handheld
    6               .               /P/A/PALM-Z22__new.jpg
    maintenant, je cherche à voir comme résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    entity_id        .          value                      .     value
    4             .    PALM PALM PDA TX Handheld        .  P/A/PALM-TX__new.jpg
    5             .    HP HP iPAQ 114 CLASSIC HANDHELD  . F/A/FA982AA.jpg
    6             .    PALM PALM Z22 Handheld           .  /P/A/PALM-Z22__new.jpg
    je sais pas si j'ai bien expliqué mais j'espère bien que vous m'aider.

  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,
    Tout cela est assez brouillon, mais je crois avoir décelé que la solution à ton problème se trouve dans l'emploi de la fonction GROUP_CONCAT couplée avec un GROUP BY.
    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
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    merci bien mais je voix pas ce que veut me dire. tu peut me donner un exemple

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT cpev.entity_id  , GROUP_CONCAT(DISTINCT cpev.value) liste
    FROM catalog_product_entity_varchar cpev
    INNER JOIN catalog_product_entity cpe ON cpe.entity_id=cpev.entity_id
    INNER JOIN catalog_category_product ccp ON ccp.product_id = cpe.entity_id
    WHERE  ccp.category_id=18 AND cpev.attribute_id IN(56,70)
    GROUP BY cpev.entity_id
    ORDER BY cpev.entity_id
    Ça devrait donner quelque chose come ça.
    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)

  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
    On va simplifier l'écriture de la requête en utilisant des alias, ce sera plus lisible...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT v.entity_id, GROUP_CONCAT(v.value SEPARATOR ':') AS 'Value:Value'
    FROM catalog_product_entity_varchar AS v
    INNER JOIN catalog_product_entity AS e ON e.entity_id = v.entity_id
     INNER JOIN catalog_category_product AS p ON p.product_id = e.entity_id WHERE  p.category_id = 18 AND v.attribute_id IN(56,70)
    GROUP BY v.entity_id
    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
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    ça me donne l'erreur suivante :
    MySql.Data.MySqlClient.MySqlException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DISTINCT catalog_product_entity_varchar.value) liste from ((catalog_product_enti' at line 1 at MySql.Data.MySqlClient.MySqlStream.OpenPacket() at MySql.Data.MySqlClient.NativeDriver.ReadResult(UInt64& affectedRows, Int64& lastInsertId) at MySql.Data.MySqlClient.MySqlDataReader.GetResultSet() at MySql.Data.MySqlClient.MySqlDataReader.NextResult() at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) at MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    voilà ce que j'ai eu dans un tableau, c'est déjà pas mal
    entity_id liste
    4 PALM PALM PDA TX Handheld ,/P/A/PALM-TX__new.jpg
    5 HP HP iPAQ 114 CLASSIC HANDHELD ,/F/A/FA982AA.jpg
    6 PALM PALM Z22 Handheld ,/P/A/PALM-Z22__new.jpg

    maintenant il faut je sépare la colonne "liste" en deux colonne

  8. #8
    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
    Juste pour info également
    GROUP_CONCAT() a été ajoutée en MySQL 4.1.
    Tout est décrit là http://dev.mysql.com/doc/refman/5.0/...functions.html de l'utilisation du DISTINCT à celle du SEPARATOR voire d'une clause ORDER BY interne au GROUP_CONCAT
    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)

  9. #9
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    merci bien Maljuna Kris pour le lien, c'est vraiment très très interssant. mais ce je cherche moi est un tableau: dans la 1er colonne entity_id la 2eme colonne liste 1 et la 3eme colonne liste 2 pour mettre les liens des images
    il y a un fichier image pour visualiser ce que je cherche .
    [IMG]file:///C:/Documents%20and%20Settings/Administrateur/Bureau/test.jpg[/IMG]
    Images attachées Images attachées  

  10. #10
    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
    En conclusion, ta table n'est pas en forme normale, la colonne contient deux types d'infos différentes.
    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)

  11. #11
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    je croix Maljuna Kris que t as raison. mais je peut pas modifier dans la table

  12. #12
    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
    Tu dois pouvoir t'en tirer en gardant le GROUP BY mais en utilisant une syntaxe à base de CASE et de REGEXP pour obtenir les deux colonnes en lieu et place du GROUP_CONCAT.
    Ce n'est pas très compliqué, mais là, je n'ai plus le temps, ma fille et mon gendre m'attendent à la piscine.
    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)

  13. #13
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    wow tu peut me donner stp un exemple. plzzzzzzzzzzzzzzz

  14. #14
    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
    Bon petite dernière vient d'appeler pour me dire que la piscine c'est à 18h.
    Alors vite fait,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT cpev.entity_id  ,
    CASE WHEN cpev.value NOT REGEXP "*\.jpg$" THEN  cpev.value END AS ref,
    CASE WHEN cpev.value REGEXP "*\.jpg$" THEN  cpev.value END AS image
    FROM catalog_product_entity_varchar cpev
    INNER JOIN catalog_product_entity cpe ON cpe.entity_id=cpev.entity_id
    INNER JOIN catalog_category_product ccp ON ccp.product_id = cpe.entity_id
    WHERE  ccp.category_id=18 AND cpev.attribute_id IN(56,70)
    GROUP BY cpev.entity_id
    ORDER BY cpev.entity_id
    Faut tester, je ne suis pas trop sûr du masque de REGEXP
    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)

  15. #15
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    ça marche pas mais merci très très fort c'est vraiment gentille

  16. #16
    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
    Citation Envoyé par smp82 Voir le message
    ça marche pas mais merci très très fort c'est vraiment gentille
    Le contraire m'eut étonné (et non tétonné, comme disait ma nourrice ).
    C'était vraiment n'importe quoi, je te laisse imaginer pourquoi, tu devais obtenir, au mieux, une des colonnes ref et image renseignée et l'autre à NULL.
    On devrait pouvoir y parvenir en transformant le code par exemple de la colonne AS image en sous-requête (et en supprimant le GROUP BY, en ajoutant un DISTINCT en début de SELECT et un cpev.value NOT REGEXP "*\.jpg$" dans la clause WHERE.
    Mais je m'interroge sur l'intérêt de compliquer à souhait une bidouille qui procède, à l'origine, d'un défaut de conception de la table.
    Ne peux-tu pas t'arranger pour décomposer le résultat de la colonne GROUP_CONCAT dans le langage qui traite le résultat de la requête.
    En php, par exemple, la fonction explode() fait cela très bien. Et dans de nombreux langages (PERL, C,..) il existe une fonction split() qui font cela tout à fait très bien (elle est également présente en php au demeurant).
    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)

Discussions similaires

  1. jointure sur 3 tables
    Par jojo22222 dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/01/2006, 22h47
  2. Jointure sur 3 tables
    Par tonymontana4192 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/11/2005, 13h24
  3. [MySQL] Jointure sur une table déjà jointe
    Par genova dans le forum Requêtes
    Réponses: 3
    Dernier message: 18/10/2005, 23h54
  4. jointure sur TROIS tables
    Par caribou_belle dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/03/2004, 11h20
  5. Jointure sur 2 tables de bases différentes
    Par Celina dans le forum Langage SQL
    Réponses: 10
    Dernier message: 10/11/2003, 11h56

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