回避策
1 つのオプションは、値にスペース#
を埋め込むことです。したがって、group_concat のすべての項目は同じ長さです。
20 文字を超えるアイテムがないと仮定しましょう。
次に、クエリは次のようになります。
SET group_concat_max_len = 10*20+9; /*execute this first.*/
/*10 items, 20 bytes each + 9 bytes for the separator*/
SELECT country,
REPLACE(GROUP_CONCAT(RIGHT(CONCAT(repeat('#',20),docID),20)),'#','') AS docIDs,
REPLACE(GROUP_CONCAT(RIGHT(CONCAT(repeat('#',20),analyst),20)),'#','') AS analysts,
REPLACE(GROUP_CONCAT(RIGHT(CONCAT(repeat('#',20),region,20)),'#','') AS regions,
REPLACE(GROUP_CONCAT(RIGHT(CONCAT(repeat('#',20),report,20)),'#','') AS reports,
REPLACE(GROUP_CONCAT(RIGHT(CONCAT(repeat('#',20),topic,20)),'#','') AS topics,
MAX((date)) AS `date`, /* LATEST DATE*/
MAX((docID)) AS docID, /* LATEST DOC*/
REPLACE(GROUP_CONCAT(RIGHT(CONCAT(repeat('#',20),date,20)),'#','') AS dates,
REPLACE(GROUP_CONCAT(RIGHT(CONCAT(repeat('#',20),event,20)),'#','') AS events,
REPLACE(GROUP_CONCAT(RIGHT(CONCAT(repeat('#',20),province,20)),'#','') AS provinces
FROM reports
GROUP BY country ORDER BY `date` DESC, docID DESC
要約すると:
x= CONCAT(repeat('#',20),docID) adds 20 x #################### in front of docID
y= RIGHT(X,20) Takes the rightmost 20 chars of that
z= GROUP_CONCAT(y) strings these together up to max_len
result = REPLACE(z,'#','') removes the `#` so the result looks normal.
または、独自のバージョンの group_concat を記述します
。独自の group_concat UDF を使用できます。
ネット上にはいくつかの例が浮かんでいます。
例: http://www.codeproject.com/KB/database/mygroupconcat.aspx?display=Mobile