MySQL:按字段计算行数

6

表中的所有行都有一个type字段,其值为0或1。

我需要在一次查询中计算0和1的行数。因此,结果应该类似于:

type0 | type1
------+------
1234  | 4211

如何实现这一点?
4个回答

12
select type, count(type) from tbl_table group by type;

我意识到我的查询将导致 OP 所需的输出格式的转置,但我假设这是可以的。 - Will

4

Lessee...

SELECT
    SUM(CASE type WHEN 0 THEN 1 ELSE 0 END) AS type0,
    SUM(CASE type WHEN 1 THEN 1 ELSE 0 END) AS type1
FROM
   tableX;

这个内容尚未经过测试。


你真的需要FROM子句吗?在MySQL中,这将增加不必要的表扫描。 - Daniel Vassallo
3
是的,你需要使用FROM子句。这是指示你正在从哪个表中读取type列的方式。 - staticsan

1

你可能想要使用标量操作的子查询

SELECT (SELECT COUNT(*) FROM table WHERE type = 0) AS type0,
       (SELECT COUNT(*) FROM table WHERE type = 1) AS type1;

在MySQL中测试如下:

CREATE TABLE t (id INT NOT NULL AUTO_INCREMENT, type INT);

INSERT INTO t VALUES (NULL, 0);
INSERT INTO t VALUES (NULL, 0);
INSERT INTO t VALUES (NULL, 1);
INSERT INTO t VALUES (NULL, 1);
INSERT INTO t VALUES (NULL, 1);

SELECT (SELECT COUNT(*) FROM t WHERE type = 0) AS type0,
       (SELECT COUNT(*) FROM t WHERE type = 1) AS type1;

+-------+-------+
| type0 | type1 |
+-------+-------+
|     2 |     3 | 
+-------+-------+
1 row in set (0.00 sec)

@Daniel - 那不是要扫描两次表格吗(例如,参见您链接页面上的评论)? - martin clayton
1
@martin:是的,它确实有效。被接受的答案应该是最有效的。显然我过于重视OP提出的输出建议了。 - Daniel Vassallo

1
可以轻松地实现如下结果:
Type  Count
-----------
type0 1234
type1 4221

你可以使用类似这样的代码:

SELECT CONCAT('type', [type]) as Type, COUNT(*) as Count
FROM MyTable
GROUP BY Type

1
请注意,在MySQL中,“+”不是连接运算符。 - Daniel Vassallo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接