2008-11-14 5 views
0

Disons que j'ai une table:tranchage Array/group_concat limitant MySQL

 
i j 
--- 
a 1 
a 2 
a 3 
a 4 
b 5 
b 6 
b 7 
b 8 
b 9 

Obvoiusly SELECT a, GROUP_CONCAT(b SEPARATOR ',') GROUP BY a me donnerait

 
a 1,2,3,4 
b 5,6,7,8,9 

Mais si je veux obtenir un nombre limité de résultats, comme 2, par exemple:

 
a 1,2 
b 5,6 

Des idées?

+0

Voulez-vous obtenir un nombre limité * de résultats, ou un sous-ensemble spécifique? C'est à dire. voulez-vous seulement deux résultats, ou voulez-vous 1,2 de a, et 4,5 de b? –

+0

D'accord, la question doit être clarifiée. – BrynJ

+0

nombre limité de résultats (2 résultats), "4,5" devrait être "5,6" bien sûr - une faute de frappe. –

Répondre

1

Le meilleur moyen est d'utiliser SUBSTRING_INDEX() et GROUP_CONCAT().

SELECT i, SUBSTRING_INDEX(GROUP_CONCAT(j), ',', 2) 
FROM mytable 
GROUP BY i; 

Vous ne devez pas savoir ici la longueur du champ j.

0

Une solution consisterait à limiter les lignes du groupe aux deux premières, avant de calculer l'agrégat.

SELECT t.i, GROUP_CONCAT(t.j) 
FROM 
    (SELECT t1.i, t1.j 
    FROM mytable AS t1 
    LEFT JOIN mytable AS t2 
     ON (t1.i = t2.i AND t1.j >= t2.j) 
    GROUP BY t1.i, t1.j 
    HAVING COUNT(*) <= 2) AS t 
GROUP BY t.i; 

Une autre solution, si vous connaissez les valeurs j sont d'une longueur fixe, est d'utiliser simplement SUBSTRING() sur le résultat:

SELECT i, SUBSTRING(GROUP_CONCAT(j), 1, 3) 
FROM mytable 
GROUP BY i;