64

在 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 作为行数,任何解决方法都值得赞赏

4

5 回答 5

141

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

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

看到这个 SQLFiddle

于 2013-05-16T10:22:45.663 回答
58

你需要做 -

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

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

于 2013-05-16T10:10:08.490 回答
8

我找到了解决方案。因此,如果要计算组的数量,而不是每个组中的元素数量,并为结果表中的每个组记录返回重复值,则应在 count 函数上使用OVER()子句。

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

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

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

于 2020-12-05T16:57:28.137 回答
0

为什么不使用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();
}
于 2018-10-02T19:14:09.990 回答
-1

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

于 2020-07-26T00:02:11.863 回答