【问题标题】:How to count the number of grouped rows in mysql when I already count the total rows当我已经计算总行数时如何计算mysql中的分组行数
【发布时间】:2015-02-25 18:01:43
【问题描述】:

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

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

【问题讨论】:

  • 我不确定您的期望。你能提供一个你正在寻找的例子吗?
  • 当然,我想得到 1。每个项目出现在表格中的次数,即 Apple - 4,Orange - 2,Grape - 2,然后我想得到 2。有多少不同的项目存在于表中 - 即 3 - 我们有 Apple、Orange 和 Grape,最后我想 3. 按名称对项目进行分组,即获得 3 行。
  • 我的意思是,您能否编辑您的问题以显示您想要的查询的输出。
  • 已编辑,我想现在我可以尝试通过 PHP 获取查询的计数...这可能更容易做到。
  • SELECT * FROM YOURTABLE JOIN A_TABLE ON B_TABLE

标签: php mysql sql count distinct


【解决方案1】:

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

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

【讨论】:

  • 嗨,迈克,我最初的问题是我是否只能通过 SQL 在返回的结果中获取计数,但是最终我决定将查询保持原样,然后我只是通过执行新的计数php 查询结果。
【解决方案2】:

您可以在子查询中获取不同名称的计数,然后将那个东西 OUTER JOIN 回到您已经解决了 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

【讨论】:

    【解决方案3】:

    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
    

    【讨论】:

    • @user3132858 你有预付款吗?
    【解决方案4】:

    你可以使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 2015-12-20
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多