Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/07/2011, 09h05   #1
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Par défaut Jointure et concaténation ?

Bonjour,

Je bloque sur une requête qui ferait intervenir une jointure et de la concaténation, mais je ne suis pas sûr que ce soit faisable.

J'ai 2 tables, elements et map_element.
Code :
1
2
3
4
5
elements
id - nom_element - champ1 - champ2 etc...
 
map_element
id - id_element - id_externe
Plusieurs ids externes (qui correspondent à d'autres type d'éléments) peuvent être reliées à un élément (mais pas l'inverse).
map_element est donc la table de correspondance où l'on peut trouver plusieurs fois le même id_element (mais chaque id_externe est unique).

Ce que je voudrais c'est récupèrer toutes les lignes et les champs de la table elements
puis faire une jointure sur la table map_element qui rajouterait dans le résultat un champ (map_ids par ex) qui contiendrait tous les id_externe relatifs à chaque élément, le tout séparé par un point virgule (ex: 45;9;63;87;5).

Est ce que c'est faisable ?

Merci d'avance pour votre aide.
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 09h41   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 026
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 026
Points : 18 317
Points : 18 317
Envoyer un message via MSN à CinePhil
Oui, en utilisant une jointure externe et CONCAT.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 12h21   #3
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Merci pour l'info.
J'en suis donc arrivé à cette requête:
Code :
SELECT e.*, CONCAT_WS(";",m.id_externe) AS map_ids FROM elements AS e LEFT OUTER JOIN map_element AS m ON e.id = m.id_element
Mais ça ne fait pas ce que je cherche car si map_element contient plusieurs lignes avec id_element à 8 par ex, il me retourne toutes les lignes.
Ce que je voudrais c'est avoir une seule ligne pour chaque id_element avec tous les id_externe dans le
champ map_ids (séparés par un point virgule).

Comment faire ?
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 12h27   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 026
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 026
Points : 18 317
Points : 18 317
Envoyer un message via MSN à CinePhil
CONCAT s'utilise avec un GROUP BY
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 12h41   #5
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Merci, mais je n'arrive pas à voir où placer GROUP BY dans ma requête.
Une idée ?
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 13h06   #6
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
De fait ici, GROUP_CONCAT, correspond davantage à ce que tu veux faire.
Quand au GROUP BY il faut qu'il porte sur la colonne pivot, à savoir, apparemment, la colonne elements.id, si j'ai bien compris la logique qui lie ces deux tables.
__________________
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 13h19   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 026
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 026
Points : 18 317
Points : 18 317
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Maljuna Kris Voir le message
De fait ici, GROUP_CONCAT, correspond davantage à ce que tu veux faire.
Au temps pour moi ! J'ai écrit mon précédent message vite fait avant d'aller manger ; je reviens et je vois cette grosse erreur affichée à l'écran !
C'est effectivement GROUP_CONCAT qui convient !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 13h52   #8
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Merci à tous les deux.
En effet c'était bien GROUP_CONCAT couplé avec GROUP BY.
La requête donne maintenant:
Code :
SELECT e.*, GROUP_CONCAT(m.id_externe) AS map_ids FROM elements AS e LEFT OUTER JOIN map_element AS m ON e.id = m.id_element GROUP BY e.id
Note: GROUP_CONCAT sépare les valeur par une virgule et pas un point virgule (mais ça ne me gêne pas ).
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h32.


 
 
 
 
Partenaires

Hébergement Web