繁体   English   中英

当我已计算总行数时,如何计算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中每个名称值的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'

作为您的最后一次编辑(ALL IN ONE):

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

您可以在子查询中获取不同名称的计数,然后将该东西连接到您已经为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM