【问题标题】:Counting number of grouped rows in mysql计算mysql中分组的行数
【发布时间】:2013-05-16 10:06:28
【问题描述】:

在 xyz 表中,我有一个名为 components 的行和一个 labref 行,其中的 labref 编号如下所示

表格 xyz

labref             component
NDQA201303001          a
NDQA201303001          a
NDQA201303001          a
NDQA201303001          a
NDQA201303001          b
NDQA201303001          b
NDQA201303001          b
NDQA201303001          b
NDQA201303001          c
NDQA201303001          c
NDQA201303001          c
NDQA201303001          c

我想对组件进行分组,然后计算返回的行数,等于 3,我编写了下面的 SQL 查询,但它无助于实现我的目标,而是为每个组件返回 4

SELECT DISTINCT component, COUNT( component ) 
FROM `xyz`
WHERE labref = 'NDQA201303001'
GROUP BY component

查询返回

表格 xyz

labref         component   COUNT(component)       
NDQA201303001   a           4
NDQA201303001   b           4
NDQA201303001   c           4

我现在想要实现的是从上面的结果中计算行数并返回 3 作为行数,感谢任何解决方法

【问题讨论】:

  • 你的意思是在这种情况下你想要 3 作为输出?
  • xyz中选择计数(DISTINCT分量)

标签: mysql sql count


【解决方案1】:

试试这个不带子查询的简单查询:

SELECT COUNT(DISTINCT component) AS TotalRows
FROM xyz
WHERE labref = 'NDQA201303001';

See this SQLFiddle

【讨论】:

  • 当然这是最好的解决方案,因为它不需要子查询。
  • 最佳解决方案。这个解决方案应该被接受,因为这是更简单更好的方法
  • 如果您没有“GROUP BY”,这将起作用。如果查询有“分组依据”,那么所有行都将有 1。
  • @JohnySkovdal - 你已经做了一个小提琴来回答一个不同的问题,所以说这个答案“不起作用”是不正确的。正如您的小提琴所示,此答案正确报告了不同值的数量。
  • @JoelEnanodJr,Bala - 你不会在这个答案中使用“Group By”;这个答案是一种 alternative 方法,在查询中不需要(也不容忍)“Group By”。 OP 仅使用“Group By”作为尝试来获得他们需要的答案。将“Group By”与“Count(Distinct)”结合起来没有意义;从您的查询中删除“分组依据”。
【解决方案2】:

你需要做的-

SELECT
    COUNT(*)
FROM
    (
        SELECT
            DISTINCT component
        FROM
            `multiple_sample_assay_abc`
        WHERE
            labref = 'NDQA201303001'
    ) AS DerivedTableAlias

您也可以按照@hims056 here 的建议避免子查询

【讨论】:

  • @Kshitij - 当我们可以做it directly时为什么要使用子查询?
  • hims056' 解决方案是更好的解决方案 - 如果可以,请避免使用子查询
  • 右括号后添加别名。
  • 这个答案的原因是当你需要一个having子句时它会起作用。 answer below 依赖于能够重写查询而无需具有子句。
【解决方案3】:

我找到了解决方案。 所以,如果你想计算组的数量,而不是每组中的元素数量,并为结果表中的每条记录返回重复值,你应该在你的计数函数上使用OVER() 子句。

所以,例如上面的解决方案是

SELECT component, COUNT(*) OVER() as number_of_components FROM `xyz` 
WHERE labref = 'NDQA201303001' 
GROUP BY component

我想这适用于任何使用 GROUP BY 的查询,其他信息,请查看上面的链接。

【讨论】:

  • 这是正确的做法。即使在使用 limit x 时也能正常工作。
  • 请注意,您需要在 MySQL 8+ 上才能使用OVER()(和其他窗口函数)。
【解决方案4】:

为什么不使用num_rows

如果你使用这种方法,你不必以任何方式修改查询。

if ($result = $mysqli->query("SELECT DISTINCT component, COUNT( component ) 
    FROM `xyz`
    WHERE labref = 'NDQA201303001'
    GROUP BY component")){

    /* determine number of rows result set */
    $row_cnt = $result->num_rows;

    printf("Result set has %d rows.\n", $row_cnt);

    /* close result set */
    $result->close();
}

【讨论】:

  • 如果 nest 选择了更短的代码:select count(1) from ( ... ) t; 将产生任何查询的行数 [有一些限制,特别是内部查询不能有重复的列名],其中 ". .." 是您正在计算的查询。为了性能,也可以将内部SELECT DISTINCT component, COUNT( component ) FROM改为SELECT DISTINCT component FROM
  • 还应注意,将大表引入 PHP 可能会达到 PHP 的过载内存限制和代码“致命错误”。更容易在内存上允许 MySQL 计算行数。
  • 因为这会给您从表返回的总行数,而不是与查询匹配的表中的总行数。尝试添加一个有 1000 个查询的limit 10
【解决方案5】:

Select labref , component ,Count(*) as Counts From xyz Group by labref , component

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 2011-04-08
    • 1970-01-01
    相关资源
    最近更新 更多