3

各国からのレポートに関する情報を引き出すためのかなり大きなクエリがありますが、現在、これを制限できる唯一の方法はLimit 10、国を制限する末尾に or を入力することです。ただし、私がやりたいことは、group_concat国ごとに を 10 件の結果に制限することです。これは、私の場合、単語の各インスタンスに何らかの形で 10 件を制限することになりますgroup_concat

私の現在のクエリは次のとおりです。

SELECT country,
GROUP_CONCAT(docID),
GROUP_CONCAT(analyst),
GROUP_CONCAT(region),
GROUP_CONCAT(report),
GROUP_CONCAT(topic),
MAX((date)) AS date,
MAX((docID)) AS docID,
GROUP_CONCAT(date) AS dates,
GROUP_CONCAT(event) AS events,
GROUP_CONCAT(province) AS provinces
FROM reports GROUP BY country 
ORDER BY date DESC, docID DESC

この質問が尋ねられたのを見たことがありますが、本当に良い答えは見たことがありません。文字に基づいてのみ制限できるため、関数がMySQLに組み込まれていないことは知っています。以前にこの問題を解決した人はいますか?

4

2 に答える 2

2

これは、ユーザーごとに投稿を制限する私の例の1つです

select user_id,SUBSTRING_INDEX(group_concat(posts.id order by rand()),',',3) from posts inner join users on users.id = posts.user_id group by posts.user_id;
于 2012-11-27T13:55:55.200 に答える
2

回避策
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

于 2011-05-24T20:09:17.220 に答える