7
votes

Comment pirater mysql group_concat pour aller chercher un nombre limité de lignes?

J'ai besoin de cette fonctionnalité, mais MySQL ne le supporte pas en ce moment.

J'utilise group_concat (Concat (...)) pour générer une matière de type XML.

Mais lorsque la taille dépasse la limite, le XML est juste brisé!

Donc, je dois faire en sorte que cela ne puisse récupérer que 5 lignes!


2 commentaires

Augmentez la valeur group_concat_max_len dans my.cnf


Peut-être que vous pouvez obtenir votre réponse ici Stackoverflow.com/questions/3378324/...


6 Réponses :


2
votes

Utilisez une table / sous-requête temporaire pour limiter les résultats? Sans voir votre requête, ce sera difficile de donner des conseils solides pour cet itinéraire.

Cependant, vous pouvez trouver le paramètre group_concat_max_len pour être plus utile. Il contrôle la longueur maximale d'une opération group_concat dans la longueur de la chaîne. Soulevez-le pour empêcher cassé group_concat s, lorsque vous ne pouvez pas vous permettre de limiter les résultats.


0 commentaires


5
votes

Un exemple de Charles Réponse:

Basic: P>

SELECT CAST( GROUP_CONCAT( field ) AS CHAR(2048) ) FROM ( SELECT field FROM table LIMIT 200 )


2 commentaires

Oui, ça marchera. Mais il aura besoin d'une construction plus complexe pour une requête avec groupe par .


J'ai eu une erreur pour "chaque table dérivée doit avoir son propre alias" lors de l'utilisation de la première requête. Pour résoudre ce problème, je l'ai changé à "Sélectionnez Group_Concat (champ) (sélectionnez le champ à partir de la limite de table 200) comme alias" Merci pour la réponse.



20
votes

J'ai travaillé autour de cela en utilisant Substring_index code>.

Par exemple: P>

SELECT SUBSTRING_INDEX(GROUP_CONCAT(Field1 SEPARATOR ','), ',', [# of elements to return])
FROM Table1;


0 commentaires

0
votes

Pour ces cas où vous ne pouvez pas utiliser une table Temp, le meilleur moyen que je connaisse est de sélectionner un séparateur obscur, puis de tronquer à partir de la première instance dudit caractère. Cet exemple utilise le caractère NUL.

Sélectionnez Substring_index (groupe_concat (séparateur de champ '\ 0'), '\ 0', 5) de la table;

champ est le nom du champ, 5 est le nombre de résultats.

L'inconvénient est si votre première ligne contient ce caractère, ce sera un résultat partiel.

Une solution de contournement serait de remplacer '\ 0' avec une chaîne aléatoire plus longue.

Il est bon de savoir que pourrait être remplacé pour inclure plus d'informations à l'aide de concat .

Gardez à l'esprit le group_concat_max_len par défaut à 1024 caractères, vous devez donc rechercher le changement global ou dans votre application si vous voulez plus que cela.


0 commentaires

2
votes

Vous pouvez simuler la rangée partitionnée à l'aide de variables utilisateur, puis limiter les lignes et appliquer group_concat:

Considérez le tableau suivant: P>

category    value_con
1           5,4,3
2           10,9,8
3           15,14,13


1 commentaires

Wow! Il est donc possible de mettre la clause WHERE en dehors de la sous-requête! Cela résout par inadvertance mon problème dans lequel j'ai eu des sous-requêtes imbriquées et MySQL ne passe pas les références de colonne plus profondes qu'un niveau. Ainsi, lorsque j'ai déplacé la clause WHERE en dehors de la sous-requête, la référence de colonne était au premier niveau et la requête couru! hmmm je suppose que si nous google assez longtemps, nous pourrions trouver des réponses à n'importe quoi! MDR