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 :

2 jointures et GROUP BY


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 270
    Points : 163
    Points
    163
    Par défaut 2 jointures et GROUP BY
    Bonjour à tous,

    imaginez un vêtement

    il a plusieurs photos et plusieurs tailles

    Je dois joindre à la fois les photos et à la fois les tailles, puis faire un group_concat

    J'ai les photos 1,2,3
    J'ai les tailles S,M,L

    Si je fais un
    join photos
    join tailles

    je vais obtenir
    1 - S
    1 - M
    1 - L
    2 - S
    2 - M
    2 - L
    3 - S
    3 - M
    3 - L
    et du coup en group_concat je vais avoir
    1,2,3,1,2,3,1,2,3 pour les photos
    et S,M,L,S,M,L,S,M,L pour les tailles

    Comment faire pour faire ces jointures et simplement obtenir
    1,2,3 en group_concat pour les photos
    et S,M,L pour les tailles

    je précise que j'ai d'autres infos à récupérer des tailles (prix, identifiant,...) donc un truc du genre "distinct" ne fonctionnerait pas

    Merci d'avance pour votre aide, je suis un peu perdu..

  2. #2
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    tu as essayé avec distinct dans group_concat?

    mais bon c'est de la cosmétique comme diraient certains

    au pire tu fais 2 requêtes séparées pour ces données là...

    parfois c'est pas forcément le plus adéquat de vouloir tout faire avec la méga requête de la mort qui tue...

    et sans plus d'infos dur de se prononcer sur le mieux à faire
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 270
    Points : 163
    Points
    163
    Par défaut
    je te confirme, je crois que c'est ce que je vais finir par faire.

    j'ai fait pour une autre requête la jointure du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT JOIN (SELECT count(*) as nbPhotos,id_produit FROM photos GROUP BY id_produit) as PHOTOS ON PHOTOS.id_produit=PRODUITS.id_produit
    mais ça alourdit considérablement la requête

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    MySQL supporte-t-il les sous-select au niveau du SELECT (et non du FROM ou du WHERE) ?

    Car je dirais un truc du genre :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select h.id, h.nom, (select group_concat(t.lettre) from taille t where t.habit_id = h.id) tailles, (select group_concat(p.fic) from photo p where p.habit_id = h.id) photos 
    from habit h
    where h.id = 1;

    Si c'est pas le cas, songez à revoir votre méthode car :
    - MySQL est tout naze et ça serait bien de changer de SGBD pour un vrai qui sait bosser
    - Mais MySQL est le seul à proposer GROUP_CONCAT donc pour ce besoin précis, changer de SGBD ne vous apportera rien ^^

    Avec deux fonctions stockées qui remplace mes deux sous-select, ça devrait passer sans problème :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select h.id, h.nom, getTailles(h.id) tailles, getPhotos(h.id) photos 
    from habit h
    where h.id = 1;

    MySQL supporte bien les fonctions stockées hein ?

    Sinon, changer de SGBD vous permettra effectivement de solutionner le problème de cette façon, qui est plus catholique déjà.
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    oui et oui... bien sur mais ça revient à ce que je dis séparer en 2 requêtes...

    sauf que tu te donnes l'illusion d'une seule avec le select final

    en plus tes sous requêtes seraient avantageusement remplacées par une voir 2 jointures...

    mais en terme de traitement ça revient à la même chose...

    tu as essayé le distinct dans chaque group_concat avant de passer à cette solution?

    de toute façon, en terme d'efficacité, et si tu dois rapatrier beaucoup de ligne, tu devrais faire 3 requête (ou 2 si tu arrive à faire les group_contat en une seule):
    • la requête principale qui ramène toutes les données n'ayant pas besoin de groupage
    • celles qui en en besoin soit sous forme de sous requêtes soit sous forme de jointures (mieux)


    quitte à,tu peux aussi faire une procédure stockée qui te retourne pour un id les 3 séries de données sous forme de 3 requêtes avec un seul appel...
    ce qui te permet de faire potentiellement un plus large éventail de traitement côté langage appelant



    bref tu vois on t'a passé en revu plein de solution parallèle pour faire la même chose...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  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 ericd69
    mais bon c'est de la cosmétique comme diraient certains
    Effectivement !

    Romalafrite, tu arrives ici à la limite de ce qu'il est raisonnable de faire avec cette fonction non standard SQL de MySQL.

    Et les autres solutions proposées, notamment les sous-requêtes corrélées dans le SELECT, ne sont pas raisonnables non plus avec un volume de données un tant soit peu conséquent.
    Citation Envoyé par Romalafrite
    je vais obtenir
    1 - S
    1 - M
    1 - L
    2 - S
    2 - M
    2 - L
    3 - S
    3 - M
    3 - L
    Contente toi de récupérer ce résultat en le triant par article et gère les ruptures dans le code applicatif pour présenter les données, ce sera beaucoup plus efficace.
    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
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 270
    Points : 163
    Points
    163
    Par défaut
    merci pour vos conseils, c'est ce que j'ai fait et c'était bien plus efficace.

    Merci encore

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 20/01/2011, 12h45
  2. Update avec jointure et group by
    Par olibara dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/11/2010, 10h18
  3. Jointure avec group by
    Par mico2 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/02/2010, 22h28
  4. Jointure, Having, Group by => Où mettre la tête ?
    Par Magnat dans le forum Requêtes
    Réponses: 3
    Dernier message: 21/01/2010, 15h59
  5. requete sql jointure + sum() + group by?
    Par bylka dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/10/2008, 12h06

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