在 GROUP_CONCAT 中使用 COUNT

Posted

技术标签:

【中文标题】在 GROUP_CONCAT 中使用 COUNT【英文标题】:Using COUNT in GROUP_CONCAT 【发布时间】:2013-07-02 00:56:20 【问题描述】:

这是我的桌子:

  id  | fk_company
-------------------
  1   |     2    
  2   |     2    
  3   |     2    
  4   |     4    
  5   |     4    
  6   |     11   
  7   |     11   
  8   |     11   
  9   |     12

我想要的结果应该是字符串“3, 2, 3, 1”(属于每个公司的项目数),因为这只是我复杂查询字符串的一部分。

我尝试使用此查询:

SELECT GROUP_CONCAT(COUNT(id) SEPARATOR ", ")
FROM `table` GROUP BY fk_company;

但我得到了一个错误:

错误号:1111 组函数使用无效

我感觉COUNTMAXMINSUM 不能用于GROUP_CONCAT。如果是这样,您知道另一种方法吗?

【问题讨论】:

你为什么要这个?接下来会发生什么? 【参考方案1】:

您需要先在内部SELECT 子句中使用COUNT()GROUP BY,然后再应用GROUP_CONCAT()

SELECT GROUP_CONCAT(cnt) cnt
FROM (
    SELECT COUNT(*) cnt
    FROM table1
    GROUP BY fk_company
) q;

输出:

|碳纳米管 | ------------ | 3,2,3,1 |

这里是 SQLFiddle 演示。

【讨论】:

非常感谢,我花了很多时间来解决这个问题。不幸的是我没有足够的时间玩,所以即使这个结果看起来很简单,我也需要帮助。 请注意,目前这依赖于 fk_company 编号以与 id 对应的方式按顺序排列的事实【参考方案2】:

您也可以通过计算 GROUP_CONCAT 中的逗号(或任何分隔符)的数量来实现:

SELECT (LENGTH(GROUP_CONCAT(DISTINCT fk_company))-LENGTH(REPLACE(GROUP_CONCAT(DISTINCT fk_company), ',', '')))
FROM `table`
GROUP BY fk_company

【讨论】:

【参考方案3】:
select GROUP_CONCAT(counts) 
   from (
      select count(id) counts from
          table group by fk_company
   );

【讨论】:

【参考方案4】:
SELECT A,  
GROUP_CONCAT(B SEPARATOR '/') AS 'Category',  
GROUP_CONCAT(C SEPARATOR '/') AS 'ALIAS_NAME',COUNT('ALIAS_NAME') AS 'Count'  
FROM carnews  
...  
...
GROUP BY 1
ORDER BY 4 DESC  

这对我来说效果很好。

【讨论】:

以上是关于在 GROUP_CONCAT 中使用 COUNT的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中使用group_concat遇到的坑

在 Netezza 中使用 GROUP_CONCAT 时缺少 ORDER BY 的解决方法

如何在 sql [重复] 中使用 group_concat() 获取不同的值

在带有 LIKE 的 CASE 语句中使用 GROUP_CONCAT 列别名

GROUP_CONCAT的进阶使用

使用 LIKE 搜索 GROUP_CONCAT