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 :

Requetes sur deux tables avec plusieurs retour


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé Avatar de IP-Fix
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    421
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 421
    Points : 494
    Points
    494
    Par défaut Requetes sur deux tables avec plusieurs retour
    Re-bonjour !

    Alors j'ai bien noté les conseil sur le * ainsi que comment me servir de AS et de JOIN quand il me retourne un champs, par contre j'ai maintenant besoin d'un join qui me retourne la liste des items ( plusieurs ) qui peuvent etre laissé par le monstre.

    J'ai une table item qui contiens les item ( id , nom ).
    J'ai une table monstre_loot qui contiens les associations item / monstre ( id / id_item, id_monstre )

    Voici ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 
    monstre.nom AS nom_monstre,
    item.nom AS item_nom FROM monstre 
    JOIN monstre_loot ON monstre_loot.id_monstre = monstre.id
    Maintenant je suis un peu perdu pour passer a la troisieme table ( item ) et avoir ces nom , de plus je sais pas comment exploité une jointure qui retourne plusieurs resultat pour item .

    Merci d'avance pour votre aide !

  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,
    Citation Envoyé par IP-Fix Voir le message
    Maintenant je suis un peu perdu pour passer a la troisieme table ( item ) et avoir ces nom , de plus je sais pas comment exploité une jointure qui retourne plusieurs resultat pour item .
    Et que penses-tu de cette requête ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
    m.nom AS nom_monstre,
    GROUP_CONCAT(i.nom) AS item_noms 
    FROM monstre m
    INNER JOIN monstre_loot ml ON ml.id_monstre = m.id
    INNER JOIN items i ON ml.id_item=i.id
    GROUP BY m.id
    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
    Membre confirmé Avatar de IP-Fix
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    421
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 421
    Points : 494
    Points
    494
    Par défaut
    Je pense que c'est ce que je cherchais ! Merci !

    Petite question complémentaire tout de meme comment exploite t'on en php GROUP_CONCAT(i.nom) ?

  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
    Citation Envoyé par IP-Fix Voir le message
    comment exploite t'on en php GROUP_CONCAT(i.nom) ?
    Bien !
    Ça dépend de ce que tu veux en faire.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    while ($ligne=mysql_fetch_assoc($result)){
             $noms=explode(',',$ligne['noms']);
             // et tous les noms sont dans l'array $noms
            }
    ?>
    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
    Membre confirmé Avatar de IP-Fix
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    421
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 421
    Points : 494
    Points
    494
    Par défaut
    Merci !

    Mais j'ai encore un petit probleme ( a prioris le dernier ! )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    m.nom AS nom_monstre,
    GROUP_CONCAT(i.nom) AS item_noms ,
    GROUP_CONCAT(ml.pourcentage) AS item_pourcentage 
    FROM monstre m 
    INNER JOIN monstre_loot ml ON ml.id_monstre = m.id
    INNER JOIN item i ON ml.id_item=i.id 
    GROUP BY m.id
    là mon probleme est que le champs pourcentage de la table monstre_loot (int(3)) me retourne un mechant : [BLOB - 5 o] là ou j'esperais un jolie retour du type : [12,24] par exemple.

    Voila j'arrive pas a m'en sortir

  6. #6
    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 IP-Fix Voir le message
    mon probleme est que le champs pourcentage de la table monstre_loot (int(3)) me retourne un mechant : [BLOB - 5 o] là ou j'esperais un jolie retour du type : [12,24] par exemple.
    Comment veux-tu qu'une colonne de type INTEGER(3) puisse te retourner une valeur flottante ?
    Par contre, je ne m'explique pas le retour d'un type BLOB.
    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)

  7. #7
    Membre confirmé Avatar de IP-Fix
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    421
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 421
    Points : 494
    Points
    494
    Par défaut
    euh , c'est pas une valeur flottante que j'attendais mais deux valeur integer séparé par une virgule (si le monstre a deux ligne dans la table monstre_loot qui correspondent a ma requete).

    Je pensais que c'était le comportement automatique de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP_CONCAT(ml.pourcentage) AS item_pourcentage

  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
    Ooops, au temps pour moi, ça m'apprendra à vouloir répondre avant de comprendre la question.
    Le GROUP_CONCAT doit retourner quelque chose de trop long et MySQL doit le caster en BLOB, j'imagine.
    Faudrait relire la doc de GROUP_CONCAT, mais là, tout de suite, je n'ai pas le temps.
    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
    Membre confirmé Avatar de IP-Fix
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    421
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 421
    Points : 494
    Points
    494
    Par défaut
    Je comprend pas trop pourquoi il cast mes deux pauvre int mais comme je peux l'exploiter comme tu m'as montré plus haut je pense avoir trouver mon bonheur ! :p

    Merci pour toute les infos !

  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
    Citation Envoyé par IP-Fix Voir le message
    Je comprend pas trop pourquoi il cast mes deux pauvre int
    On ne s'est pas compris, à quel niveau obtiens-tu un [BLOB - 5o] ?
    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
    Membre confirmé Avatar de IP-Fix
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    421
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 421
    Points : 494
    Points
    494
    Par défaut
    dans le champs : item_pourcentage

  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
    Ou-là, on n'est pas rendu.
    Voyons si j'arrive à poser explicitement ma question (c'est pas gagné ).
    Tu veux dire dans GROUP_CONCAT(ml.pourcentage) AS item_pourcentage
    N'est-ce pas ?
    Mais, si c'est le cas, en lisant le résultat dans PhpMyAdmin ?
    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
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    salut,

    peux tu nous donner le script de création de tes tables, ainsi qu'un jeu d'essai (insert pour remplir les tables) afin qu'on puisse reproduire le problème?

    Merci

  14. #14
    Membre confirmé Avatar de IP-Fix
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    421
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 421
    Points : 494
    Points
    494
    Par défaut
    Ouip c'est bien : GROUP_CONCAT(ml.pourcentage) AS item_pourcentage qui me retourne le blob.

    Voila les table :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `item`
    --
     
    CREATE TABLE `item` (
      `id` int(11) NOT NULL auto_increment,
      `nom` varchar(255) NOT NULL,
      `categorie` int(11) default NULL,
      `description` text,
      `panoplie` int(11) default NULL,
      `bonus` text,
      `malus` text,
      `image` varchar(255) default NULL,
      PRIMARY KEY  (`id`),
      UNIQUE KEY `nom` (`nom`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
     
    --
    -- Contenu de la table `item`
    --
     
    INSERT INTO `item` (`id`, `nom`, `categorie`, `description`, `panoplie`, `bonus`, `malus`, `image`) VALUES
    (1, 'item de test', NULL, 'un malheureux item de test', NULL, NULL, NULL, NULL),
    (2, 'un autre item', NULL, NULL, NULL, NULL, NULL, NULL);
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `monstre`
    --
     
    CREATE TABLE `monstre` (
      `id` int(11) NOT NULL auto_increment,
      `nom` varchar(255) NOT NULL,
      `degat_max` int(255) default NULL,
      `degat_min` int(6) default NULL,
      `level_min` int(4) default NULL,
      `level_max` int(4) default NULL,
      `pa` tinyint(2) default NULL,
      `pm` tinyint(2) default NULL,
      `agressif` tinyint(1) default NULL,
      `porte` tinyint(1) default NULL,
      `race` int(11) default NULL,
      `pv` int(4) default NULL,
      `image` varchar(255) default NULL,
      PRIMARY KEY  (`id`),
      UNIQUE KEY `id` (`id`,`nom`),
      UNIQUE KEY `nom` (`nom`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;
     
    --
    -- Contenu de la table `monstre`
    --
     
    INSERT INTO `monstre` (`id`, `nom`, `degat_max`, `degat_min`, `level_min`, `level_max`, `pa`, `pm`, `agressif`, `porte`, `race`, `pv`, `image`) VALUES
    (1, 'Boulmog', 24, 24, 17, 20, 4, 4, 0, 0, 5, 199, ''),
    (12, 'Piou Bleue', 12, 0, 1, 5, NULL, NULL, 0, 0, 0, 12, '1226504196.jpg');
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `monstre_loot`
    --
     
    CREATE TABLE `monstre_loot` (
      `id` int(11) NOT NULL auto_increment,
      `id_item` int(11) NOT NULL,
      `id_monstre` int(11) NOT NULL,
      `pourcentage` int(3) NOT NULL,
      PRIMARY KEY  (`id`),
      UNIQUE KEY `id_item` (`id_item`,`id_monstre`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
     
    --
    -- Contenu de la table `monstre_loot`
    --
     
    INSERT INTO `monstre_loot` (`id`, `id_item`, `id_monstre`, `pourcentage`) VALUES
    (1, 1, 1, 12),
    (2, 2, 1, 12);

  15. #15
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    salut,

    avec ton jeu d'essai, voici ce que me retourne ta requête (directement sur MySQL) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    +-------------+----------------------------+------------------+
    | nom_monstre | item_noms                  | item_pourcentage |
    +-------------+----------------------------+------------------+
    | Boulmog     | item de test,un autre item | 12,12            |
    +-------------+----------------------------+------------------+
    cela semble être ce que tu veux non?

  16. #16
    Membre confirmé Avatar de IP-Fix
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    421
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 421
    Points : 494
    Points
    494
    Par défaut
    Oui exactement et comme dit plus haut sa marche aussi sous php par contre sous mysql (installer avec wamp) sa me retourne un blob

    bref je pense sa doit venir de ma version de mysql !

    Merci !

  17. #17
    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
    Je ne crois pas ça vienne de MySQL, car il m'arrive, effectivement, de rencontrer ce genre de comportement de PhpMyAdmin avec les colonnes résultant de GROUP_CONCAT sous WAMP.
    C'est parfois agaçant, qu'on on teste, mais vu qu'en production le résultat est toujours retravaillé par un langage procédural (php, pour ce qui me concerne), je m'en arrange.
    Je crois bien me souvenir que le problème est également présent avec MySQL Control Center.
    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)

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

Discussions similaires

  1. Requete sur deux tables avec tri
    Par ebaoo dans le forum MySQL
    Réponses: 2
    Dernier message: 25/02/2010, 18h41
  2. Réponses: 10
    Dernier message: 11/08/2009, 14h43
  3. requete sur deux tables avec join et coalesce
    Par nifufu dans le forum Requêtes
    Réponses: 14
    Dernier message: 10/02/2009, 13h51
  4. besoin d'aide -> requete sur 2 tables avec count()
    Par parksto dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/10/2005, 19h06
  5. Requete sur deux tables
    Par ReaseT dans le forum ASP
    Réponses: 13
    Dernier message: 07/02/2005, 16h18

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