web-dev-qa-db-ja.com

mysqlでグループ化された行の数を数える

表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が返されるということです。

47
alphy

あなたがする必要があります-

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

@ hims056 here で示唆されているように、サブクエリを避けることもできます

37
Kshitij

サブクエリなしでこの簡単なクエリを試してください:

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

このSQLFiddleを参照

102
hims056

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();
}
0