2009-10-05 4 views
6

Ich brauche irgendwie diese Funktion, aber MySQL unterstützt es in diesem Moment nicht.Wie hackt MySQL GROUP_CONCAT, um eine begrenzte Anzahl von Zeilen zu holen?

Ich verwende GROUP_CONCAT(CONCAT(...)), um ein XML-ähnliches Zeug zu erzeugen.

Aber wenn die Größe das Limit überschreitet, ist die XML nur gebrochen!

Also muss ich irgendwie machen es nur 5 Zeilen abrufen!

+0

Erhöhung group_concat_max_len Wert in my.cnf – Omesh

+1

können Sie Ihre Antwort hier http://stackoverflow.com/questions/3378324/limit-ignored-in-query-with-group-concat bekommen http://stackoverflow.com/questions/23608464/group-concat-with-limit –

Antwort

2

Verwenden Sie eine temporäre Tabelle/Unterabfrage, um die Ergebnisse zu begrenzen? Ohne Ihre Anfrage zu sehen, wird es schwierig sein, einen soliden Rat für diese Route zu geben.

Sie können jedoch die group_concat_max_len Einstellung als sinnvoller empfinden. Er steuert die maximale Länge einer GROUP_CONCAT Operation in Stringlänge. Heben Sie es auf, um gebrochene GROUP_CONCAT s zu vermeiden, wenn Sie es sich nicht leisten können, die Ergebnisse einzuschränken.

2

nicht wirklich eine Antwort auf Ihre Frage, sondern eine ref für andere Menschen, die auch eine LIMIT-Klausel in GROUP_CONCAT() verwenden möchten: vor

A feature-request eingereicht langen MySql Entwickler wurde. Noch nicht umgesetzt :-(

4

Ein Beispiel für Charles Antwort:

basic:

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

erweitert:

CAST kann nützlich sein, wenn das Ergebnis durch Puffer abgeschnitten werden:

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

Ja, es wird funktionieren. Für eine Abfrage mit 'GROUP BY' wird jedoch eine komplexere Konstruktion benötigt. –

+0

Ich habe einen Fehler für "Jede abgeleitete Tabelle muss ihren eigenen Alias ​​haben" bei der ersten Abfrage erhalten. Um das zu beheben, änderte ich es in "SELECT GROUP_CONCAT (Feld) FROM (SELECT Feld FROM Tabelle LIMIT 200) AS Alias" Danke für die Antwort. – Henry

15

Ich habe dies mit SUBSTRING_INDEX.

Zum Beispiel:

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

Es gibt Blob zurück, aber dieses funktioniert. –

0

Für die Fälle, in denen Sie nicht eine temporäre Tabelle verwenden können, die beste Weise, die ich kenne, ist ein obskures Separator auszuwählen und dann gestutzt in der ersten Instanz des Zeichens beginnen. In diesem Beispiel wird das NUL-Zeichen verwendet.

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

Wo field der Name des Feldes ist, ist 5 die Anzahl der Ergebnisse.

Der Nachteil ist, wenn Ihre erste Zeile dieses Zeichen enthält, wird es ein Teilergebnis sein.

Eine Problemumgehung wäre, '\0' durch eine längere zufällige Zeichenfolge zu ersetzen.

Es ist gut zu wissen, dass field ersetzt werden könnte, um weitere Informationen mit concat aufzunehmen.

Denken Sie daran, dass die group_concat_max_len Standardeinstellungen 1024 Zeichen lang sind. Sie sollten also entweder global oder in Ihrer Anwendung Änderungen vornehmen, wenn Sie mehr als das möchten.

0

Sie können die partitionierten simulieren row_number Benutzervariablen und dann Reihen begrenzen und gelten Group_concat:

Betrachten Sie die folgende Tabelle:

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

und Daten:

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); 

Und wir wollen ist top 3 (in der Reihenfolge der letzten ID) Wert pro verketteter Kategorie:

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; 

Ausgang:

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

Hier ist ein demo dafür.

Verwandte Themen