2009-10-05 11 views
6

In qualche modo ho bisogno di questa funzionalità, ma MySQL non lo supporta in questo momento.Come hackerare MySQL GROUP_CONCAT per recuperare un numero limitato di righe?

Sto usando GROUP_CONCAT(CONCAT(...)) per generare un materiale simile a xml.

Ma quando la dimensione supera il limite, l'xml è appena rotto!

Quindi devo in qualche modo farlo recuperare solo 5 righe!

+0

aumento del valore group_concat_max_len in my.cnf – Omesh

+1

può essere è possibile ottenere la risposta qui http://stackoverflow.com/questions/3378324/limit-ignored-in-query-with-group-concat http://stackoverflow.com/questions/23608464/group-concat-with-limit –

risposta

2

Utilizzare una tabella/sottoquery temporanea per limitare i risultati? Senza vedere la tua domanda, sarà difficile dare consigli solidi per quella rotta.

Tuttavia, è possibile trovare l'impostazione group_concat_max_len più utile. Controlla la lunghezza massima di un'operazione GROUP_CONCAT, nella lunghezza della stringa. Sollevalo per evitare rotture di GROUP_CONCAT s, quando non puoi permetterti di limitare i risultati.

2

Non proprio una risposta alla tua domanda, ma un ref per le altre persone che avrebbero anche decidere di utilizzare una clausola LIMIT in group_concat():

Un feature-request è stata presentata tempo fa di sviluppatori di MySQL. Non ancora implementato :-(

4

Un esempio per Charles risposta:

base:

SELECT GROUP_CONCAT(field) FROM (SELECT field FROM table LIMIT 200) 

esteso:

CAST può essere utile se il risultato è troncato da buffer:

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

Sì, funzionerà. Ma avrà bisogno di una costruzione più complessa per una query con 'GROUP BY'. –

+0

Ho ricevuto un errore per "Ogni tabella derivata deve avere il proprio alias" quando si utilizza la prima query. Per risolvere il problema, l'ho modificato in "SELEZIONA GROUP_CONCAT (campo) FROM (campo SELECT FROM tabella LIMIT 200) AS alias" Grazie per la risposta. – Henry

15

Ho lavorato su questo utilizzando SUBSTRING_INDEX.

Ad esempio:

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

Restituisce blob, ma questo funziona. –

0

Per quei casi in cui non è possibile utilizzare una tabella temporanea, Il modo migliore che conosco è quello di selezionare un separatore oscuro e poi tronca a partire dalla prima istanza di detto carattere. Questo esempio usa il carattere NUL.

select substring_index(group_concat(field separator '\0'), '\0', 5) from table;

Dove field è il nome del campo, 5 è il numero di risultati.

Lo svantaggio è se la prima riga contiene quel carattere, sarà un risultato parziale.

Una soluzione alternativa sarebbe sostituire '\0' con una stringa casuale più lunga.

È bello sapere che field potrebbe essere sostituito per includere ulteriori informazioni utilizzando concat.

Ricordare che il valore predefinito di group_concat_max_len è 1024 caratteri, quindi è consigliabile modificarlo globalmente o all'interno dell'applicazione se si desidera ottenere di più.

0

è possibile simulare il partizionato row_number utilizzando variabili utente e quindi limitare le righe e applicare group_concat:

Si consideri la seguente tabella:

create table your_table (
    id int primary key autoincrement, 
    category int, 
    value int 
); 

e dati:

insert into your_table (category, value) 
values 
(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), 
(2, 6), (2, 7), (2, 8), (2, 9), (2, 10), 
(3, 11), (3, 12), (3, 13), (3, 14), (3, 15); 

e vogliamo è il primo 3 (in ordine di ultimo id) valore per categoria concatenato:

select category, 
    group_concat(value order by id desc) as value_con 
from (
    select t.*, 
     @rn := if(@category = category, @rn + 1, if(@category := category,1, 1)) as seqnum 
    from your_table t 
    cross join (select @category := null, @rn := 0) x 
    order by t.category, t.id desc 
    ) t 
where seqnum <= 3 
group by category; 

uscita:

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

Ecco una demo di questo.

Problemi correlati