Mysql groupby获取名称的平均长度

Mysql groupby获取名称的平均长度,mysql,group-by,string-length,Mysql,Group By,String Length,我正在使用group by function从我的小店获得一些产品,如: select name, ProductID from blog group by ProductID +----------------------------------------------------------+ | name | +-------------------------------------

我正在使用group by function从我的小店获得一些产品,如:

select name, ProductID from blog group by ProductID

+----------------------------------------------------------+
| name                                                     |
+----------------------------------------------------------+
| AAA                                                      |
| BBBB                                                     |
| CCCC                                                     |
| DDDDDDDD                                                 |
+----------------------------------------------------------+
是否可以在groupby函数中获取平均长度名称

编辑(从OP,放置在应答中):

在这个例子中,我需要获得一个值,比如BBBBBB或CCCCCC(AVG?)

尝试以下查询:

SELECT AVG(CHAR_LENGTH(name)) AS avg FROM tbl; 

您的示例没有得到平均长度名称,因为没有这样的名称。平均长度为(8+3+6+6)/4=5.75。它不存在。我想你需要中间值,即50%大50%小的尺寸

下面是一种获取中间值的方法(假设名称不包含逗号,并且连接不超过某些限制):


如果要查找平均值(这意味着您必须接受高于或低于该十进制值的整数),可以使用以下方法:

SELECT *
FROM (
  SELECT AVG(CHAR_LENGTH(name)) AS average
  FROM product) AS calculated
JOIN product
  ON CHAR_LENGTH(name) BETWEEN FLOOR(average) AND CEILING(average);

mysql中字符串的长度是
CHAR\u Length
,所以在您的例子中应该是
MAX(CHAR\u Length(name))/COUNT(DISTINCT(name))
,但这在索引方面效率很低。如果您需要的话,您应该有一个单独的列,其中预先计算了长度。如果没有,你应该更清楚地说明你需要什么。在你的例子中,答案是什么?1在4.75时的值((3+4+4+8)/4)?或者对于每一行,名称的平均长度,因为每个ProductID有超过1个名称?在这个例子中,我需要BBBB或CCCC不是最小的长度,也不是最长的长度感谢Gordon提供了这个解决方案,是否有可能将字符从“,”改为“| |”?感谢将索引(group_concat(名称顺序按长度(名称)分隔符“| |”)、“| |”,count(*)/2)作为中间长度名称-这不起作用:(这不是只列出了一半的名字——长度最小的名字吗?例如,如果组|CONCAT返回
1,223334445555
,它不会返回'1,22',但中位数是333吗?对,我已经测试过了:/其他解决方案吗?分隔符应该是| |…这也不起作用。/@AgRizzo…我想我已经解决了这两个问题。)问题。一个只是一个“一个接一个”的错误。第二个更愚蠢…忽略第二个
子字符串\u index()
以获取最后一个值。
select ProductID,
       substring_index(substring_index(group_concat(name order by length(name) separator '||'
                                                   ), '||', 1 + count(*)/2
                                      ), '||', -1) as MedianLengthName
from blog
group by ProductID;
SELECT *
FROM (
  SELECT AVG(CHAR_LENGTH(name)) AS average
  FROM product) AS calculated
JOIN product
  ON CHAR_LENGTH(name) BETWEEN FLOOR(average) AND CEILING(average);