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

你的意思是在这种情况下你想要3作为输出?

从xyz中选择计数(DISTINCT组件)

在没有子查询的情况下尝试这个简单的查询:

SELECT COUNT(DISTINCT component) AS TotalRows

FROM xyz

WHERE labref = 'NDQA201303001';

看到这个SQLFiddle

当然这是最好的解决方案,因为它不需要子查询。

最佳方案。应该接受这个解决方案,因为这是更简单和更好的方法

如果您没有"GROUP BY",这将有效。如果查询具有"分组依据",则所有行都将为1。

@ hims056问题是"GROUP BY组件"例如::如果我们有像(id, component, labref) (1, 1, NDQA201303001), (2, 1, NDQA201303001), (3, 2, NDQA201303001), (4, 2, NDQA201303001);那样的数据然后如果我们执行SELECT COUNT(DISTINCT component) AS TotalRows FROM xyz WHERE labref = NDQA201303001 group by component它的结果就像TotalRows 1,1

我在相同的情况下,@ Bala是正确的,如果查询具有"分组依据",此解决方案将无法工作。 -1

@ hims056我在这里编写了一个不起作用的小提琴:sqlfiddle.com/#!9/8295c9 / 2/1 - 只有第三个SQL提供了正确的结果:"有多少个不同的值出现多次?"

虽然这个问题有点偏离主题,但是当我第一次找到这个答案时,我仍然会找到答案。 :)

@JohnySkovdal - Youve做了一个小提琴来回答另一个问题,所以说这个答案"不起作用"是不正确的。正如您的小提示所示,此答案正确报告了不同值的数量。

@JoelEnanodJr,Bala - 你不会在这个答案中使用"Group By";这个答案是另一种方法,它不需要(也不能容忍)查询中的"分组依据"。 OP仅使用"Group By"作为尝试获得他们需要的答案。将"Group By"与"Count(Distinct)"组合起来没有意义;从查询中删除"分组依据"。

@ToolmakerSteve已经有一段时间了,所以当时我不知道我的推理,我想我可能会把一些评论者误认为OP。我想说的是:如果你的查询更复杂,需要GROUP BY来缩小它想要计算的数据,那么这个小提琴提供了一个允许的方法:sqlfiddle.com/#!9/8295c9 / 2 / 1 - 如果不是这样的话,这个答案是更好/更简单的选择方法。

你需要做 -

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

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

@Kshitij - 为什么我们可以直接使用子查询?

@ hims056不是必需的。

hims056解决方案是更好的解决方案 - 如果你能够避免subquerys

关闭括号后添加别名。

这个答案的原因是当你需要一个having子句时它会起作用。下面的答案依赖于能够在没有having子句的情况下重写查询。

为什么不使用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.
", $row_cnt);
/* close result set */
$result->close();
}

如果嵌套选择了更短的代码:select count(1) from ( ... ) t;将产生任何查询的行数[有一些限制,特别是内部查询不能有重复的列名],其中"..."是您正在计算的查询。为了提高性能,还可以将内部SELECT DISTINCT component, COUNT( component ) FROM更改为SELECT DISTINCT component FROM。