2014-03-25 44 views
0

我使用group by函数来获取一些产品从我像小店铺:GROUPBY获得平均长度名字

select name, ProductID from blog group by ProductID 

+----------------------------------------------------------+ 
| name              | 
+----------------------------------------------------------+ 
| AAA              | 
| BBBB              | 
| CCCC              | 
| DDDDDDDD             | 
+----------------------------------------------------------+ 

是否有可能获得在GROUPBY功能的平均长度的名字吗?

EDIT(从OP,放置在回答):(?AVG)

myysql> select length(name) as len, name from product where article=40 order by len asc; 
+------+----------------------------------------------------------+ 
| len | name              | 
+------+----------------------------------------------------------+ 
| 3 | aaa              | 
| 6 | BBBBBB             | 
| 6 | CCCCCC             | 
| 8 | dddddddd             | 
+------+----------------------------------------------------------+ 
4 rows in set (0.00 sec) 

通过这个例子,我需要得到像BBBBBB或CCCCCC一个值

+0

长度为'CHAR_LENGTH',所以你的情况是'MAX(CHAR_LENGTH( name))/ COUNT(DISTINCT(name))''但这是非常低效的索引。如果这是你需要的,你应该有一个预先计算好长度的单独列。如果不是,你应该更清楚地说明你需要什么。 –

+0

在你的例子中,答案是什么? 1值为4.75((3 + 4 + 4 + 8)/ 4)?或者每行的平均名称长度是多少,因为每个ProductID有多个名称? – AgRizzo

+0

通过这个例子我需要BBBB或CCCC不是最小的长度和最长的长度 – kewl

回答

0

尝试此查询:

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

您的示例没有得到平均长度名称,因为没有这样的事情。平均长度将是(8 + 3 + 6 + 6)/ 4 = 5.75。它不存在。我想你想要的是中位数,这个数字是50%更大,50%更小的大小。

这里是一个办法让中位数(假设名称不包含逗号和串联不超过一定的限度):

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; 
+0

感谢Gordon对于这个解决方案,是否有可能将char从“,”变为“||” ?谢谢 – kewl

+0

substring_index(group_concat(名称顺序的长度(名称)SEPARATOR'||'),'||',计数(*)/ 2)作为MedianLengthName - 这是行不通的:( – kewl

+0

这不只是列出一半例如,如果GROUP_CONCAT返回1,2,2,333,4444,55555',它不会返回'1,22',但是中位数是333? – AgRizzo

0

如果你正在寻找一个均值平均(这意味着你必须要接受的上方和下方是十进制值的整数),您可以使用此:

在MySQL中字符串的
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);