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 :

question sur GROUP CONCAT


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut question sur GROUP CONCAT
    Bonjour tout le monde !

    Je bosse actuellement sur un site de produits bio pour lequel je dois développer une page affichant tous les produits classés par catégorie. Jusqu'à présent, j'utilisais pour ce genre de demande une requete avec 2 GROUP CONCAT et je récupérais mes catégories avec un explode PHP puis les produits avec un second explode.

    Mais lors d'un projet récent, j'ai été confronté au probleme de la taille maximale d'un champ group concat (group_concat_max_len). Je me demande comment faire les choses proprement pour mes produits bio. Voilà la structure de la table produits:

    PRODUITS:
    id
    idcategorie
    nom
    provenance
    texte
    url


    Et voila la requete avec les 2 CONCAT que j'aurais utilisé d'habitude:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT id_categorie, GROUP_CONCAT( CONCAT( id, '=>', id_categorie, '=>', nom, '=>', provenance )
    SEPARATOR '|' ) AS monChamp
    FROM produits
    GROUP BY id_categorie
    Est ce que ce type de requete est une aberration complète? Si oui, quelle est la bonne solution à choisir?

    Si c'est comme ca qu'il faut s'y prendre, comment augmenter la taille du champ group_concat? J'ai lu qu'il fallait utiliser cette commande mais je ne comprends pas où et comment la mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET [SESSION | GLOBAL] group_concat_max_len = nbre de caractères;
    J'avoue que je suis très loin d'etre un connaisseur sur MySQl et que vos avis m'aideraient bien

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    C'est un problème d'algorithme, et pas vraiment de SQL...
    D'un point de vue SQL, il vaut mieux interroger la base une seule fois (ce que tu fais, d'ailleurs), mais en séparant les données ramenées par le SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id, idcategorie, nom, provenance...
    FROM produit
    ORDER BY idcategorie
    En effet, GROUP_CONCAT est une fonction propre à MySQL et ne résout rien si le nombre de produits d'une catégorie augmente...

    Ensuite, c'est au niveau du PHP qu'il faut trouver une solution pour traiter chaque catégorie. Là, je ne peux pas trop t'aider, je ne suis pas spécialiste de la question.

    Eventuellement (c'est une piste qui en vaut sans doute d'autres), pourquoi ne pas faire une requête qui donne au préalable le nombre de produits dans chaque catégorie. Ca facilite les boucles de traitements par la suite...

    ced

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse et de ta réactivité...mais en fait j'ai mal exposé mon probleme...

    En fait je ne veux pas afficher uniquement les produits mais les catégories de produits, même celles qui sont vides.Je dois donc interroger la table categories (qui a 2 champs: id_categorie et nom_categorie) et je fais un LEFT JOIN sur la table produits. La requete que j'utilise à l'heure actuelle est donc plutot la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT cat.id_categorie, cat.nom_categorie,				
    GROUP_CONCAT(CONCAT(pr.id, '=>', pr.id_categorie, '=>', pr.nom, '=>', pr.provenance) SEPARATOR '|' ) AS monChamp
    FROM categories_produits cat
    LEFT JOIN produits pr ON pr.id_categorie = cat.id_categorie
    GROUP BY cat.id_categorie
    Et rien à faire, je ne pige pas comment je peux me passer de ce foutu GROUP_CONTACT...

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Citation Envoyé par Dranak Voir le message
    Et rien à faire, je ne pige pas comment je peux me passer de ce foutu GROUP_CONTACT...
    Parce que tu veux tout ramener en une seule ligne... Et que le SQL n'est pas fait pour ça .
    Le SQL est prévu pour ramener des lignes de données. La mise en forme des informations, c'est à l'application de la faire.

    Ta requête est correcte, sauf qu'il faut te passer de ce GROUP_CONCAT... Mais là, comme je le disais précédemment, c'est un problème d'algorithme.

    ced

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ca y'est ca marche ! Grace à tes conseils j'ai repensé mon algo (2 requetes, une pour les categories, une pour les produits, des boucles et des tableaux pour récupérer ce qu'il faut là ou il faut).

    J'en ai ch*** mais tout fonctionne sans GROUP BY.

    Merci beaucoup !

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

Discussions similaires

  1. question sur groupe policy preference
    Par adel87 dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 18/09/2014, 10h12
  2. [2.x] FOSUserBundle Questions sur l'utilisation des groupes
    Par macanish dans le forum Symfony
    Réponses: 1
    Dernier message: 29/02/2012, 17h02
  3. [MySQL 4.0] Question sur GROUP BY
    Par Fabouney dans le forum Langage SQL
    Réponses: 10
    Dernier message: 25/09/2006, 19h45
  4. [MySQL] Question sur les GROUP BY
    Par Coladin dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/04/2006, 14h25

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