当我已经计算了总行数时,如何计算mysql中分组的行数


How to count the number of grouped rows in mysql when I already count the total rows

我有下表,我想做以下事情:

  1. 统计每个项目在表中出现的次数

  2. 计算的DISTINCT项目数

  3. 按名称对项目进行分组

    +-------+---------+
    |  id   |  names  |
    +-------+---------+
    |   1   |  Apple  |
    |   2   |  Orange | 
    |   3   |  Grape  | 
    |   4   |  Apple  | 
    |   5   |  Apple  | 
    |   6   |  Orange | 
    |   7   |  Apple  | 
    |   8   |  Grape  |  
    +-------+---------+
    

    对于1。和3。要点我有以下查询,它运行得很好:

    SELECT * , 
       COUNT(names) as count_name, 
       FROM tbl_products WHERE type = '1' 
       GROUP BY names
    

    所以我得到:

    Apple  (4)
    Orange (2)
    Grape  (2)
    

现在,我还想计算按行分组的数量,并添加一行来计算不同的元素,但存在一些问题,因为MySQL接受查询,但无法输出结果:

SELECT * , 
   COUNT(names) as count_name, 
   COUNT(DISTINCT names) as count_total 
   FROM tbl_products WHERE type = '1' 
   GROUP BY names

有人能告诉我可能出了什么问题吗?

编辑:为了获得更多的许可,我想得到一张这样的桌子:

    +-------+---------+------------+-------------+
    |  id   |  names  |  count_ctg | count_total |
    +-------+---------+------------+-------------+
    |   1   |  Apple  |      4     |      3      |
    |   2   |  Orange |      2     |      3      |
    |   3   |  Grape  |      2     |      3      |
    +-------+---------+------------+-------------+

为什么不直接使用您正在使用的查询:

SELECT * , 
COUNT(names) as count_name, 
FROM tbl_products WHERE type = '1' 
GROUP BY names

此查询实现了所有三个目标。

1) 您可以获得count_name中每个名称值的数量计数。

2) 不同的names值的数量将等于结果集中的行数,因为您是按names分组的。几乎任何客户端MySQL数据库连接库都可以让您检索这个值。

3) 通过明确使用GROUP BY names ,您满足了按名称分组的第三个标准

当然,结果集中id的值是没有意义的,您可能只想选择namescount_names

1-。统计每个项目在表中出现的次数:

SELECT names, count(names) FROM tbl_products WHERE type = '1' group by names

2-。表中有多少不同的项目:

SELECT DISTINCT names FROM tbl_products WHERE type = '1'

3-。按名称对项目分组:

SELECT count(DISTINCT names) as Total FROM tbl_products WHERE type = '1'

作为您的最后一期(一体化):

SELECT id, names, count(names), total FROM tbl_products, (select count(distinct names) as total from tbl_products) as total WHERE type = '1' group by names

您可以在子查询中获得不同名称的计数,然后OUTER将其重新连接到您已经解决了1和3:的主查询中

SELECT names , 
    COUNT(names) as count_name, 
    Total
FROM tbl_products 
    OUTER JOIN (SELECT count(DISTINCT names) as Total FROM tbl_products) t2 
WHERE type = '1' 
GROUP BY names

您可以使用SQL Windowing OVER()

此查询返回row_number()函数作为结果中的id列,row_number的over(…)需要order by子句。你可以随心所欲地点,但大多数都是由某种东西点的。

;WITH vwGroups (name, Quantity) AS 
(
    SELECT  name
    ,       COUNT(*)
    FROM    tbl_products
    GROUP BY name 
)
SELECT  ROW_NUMBER() OVER(ORDER BY Quantity DESC, name) AS id
,       name
,       Quantity AS count_name
,       COUNT(*) OVER () AS count_total
FROM    vwGroups