在表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。