mysql分组取数量_关于sql:计算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作为行数,任何解决方法是值得赞赏的

你的意思是在这种情况下你想要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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值