Подсчет количества сгруппированных строк в mysql

В таблице xyz у меня есть строка с именем компонентов и строка 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 возвращено как число строк. Любой обходной путь приветствуется.

 hims05616 мая 2013 г., 12:13
Вы имеете в виду, что вы хотите 3 в качестве выхода в этом случае?
 trapaank16 мая 2013 г., 12:19
выберите количество (DISTINCT компонент) изxyz

Ответы на вопрос(3)

SELECT COUNT(DISTINCT component) AS TotalRows
FROM xyz
WHERE labref = 'NDQA201303001';
Смотрите этот SQLFiddle
 ToolmakerSteve20 янв. 2019 г., 03:38
@JohnySkovdal - Вы сделали скрипку, чтобы ответить на другой вопрос, поэтому говорить, что этот ответ «не работает», неверно. Как показывает ваша скрипка, этот ответ правильно отображает количество различных значений.
 ToolmakerSteve20 янв. 2019 г., 03:41
@JoelEnanodJr, Бала - Вы не будете использовать «Группировать по» с этим ответом; этот ответальтернатива подход, который не требует (и не терпит) «Группировать по» в запросе. ОП использовал только «Группировать по» какпопытка чтобы получить ответ, который им нужен. Объединение «Group By» с «Count (Distinct)» не имеет смысла; Удалите «Группировать по» из вашего запроса.
 Ayyaz Zafar25 авг. 2017 г., 21:51
Лучшее решение. Это решение должно быть принято, так как это более простой и лучший подход
 Bala20 дек. 2017 г., 04:07
Это будет работать, если у вас нет «GROUP BY». Если запрос имеет «Группировать по», то все строки будут иметь 1.
 Meloman21 дек. 2016 г., 16:58
Конечно, это лучшее решение, потому что оно не требует подзапроса.

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();
}
 ToolmakerSteve20 янв. 2019 г., 03:51
Более короткий код, еслигнездо выбирает:select count(1) from ( ... ) t; выдаст количество строк любого запроса [с некоторыми ограничениями, в частности, внутренний запрос не должен иметь повторяющихся имен столбцов], где «...» - это просчитываемый вами запрос. Для производительности, также может изменить внутреннийSELECT DISTINCT component, COUNT( component ) FROM вSELECT DISTINCT component FROM.
Решение Вопроса

Вам нужно сделать -

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

Вы также можете избежать подзапроса, как предлагает @ hims056Вот

 Kshitij16 мая 2013 г., 12:48
@ hims056 не требуется.
 Gene Kelly22 окт. 2015 г., 20:42
Добавьте псевдоним после закрывающей скобки.
 hims05616 мая 2013 г., 12:28
@Kshitij - Зачем использовать подзапрос, когда мы можем сделатьэто напрямую?
 fubo11 нояб. 2014 г., 17:01
hims056 'решение лучше - избегайте подзапросов, если вы можете

Ваш ответ на вопрос