mysql计算具有特定列的行

时间:2010-09-17 03:10:53

标签: php mysql stored-procedures

我有一张这样的表

高级名称
1 A
2 B
3 C
4 C
5 C
6 E
7 A
8 A
9 A
10 E
11 B
12 B

我需要这样的输出
A = 4次
B = 3次
C = 3次
E = 2次

我怎样才能做到这一点?

提前致谢

4 个答案:

答案 0 :(得分:5)

SELECT Name, COUNT(Sr) FROM myTable GROUP BY Name ORDER BY Name ASC;

答案 1 :(得分:3)

您可能想要使用:

SELECT   name, CONCAT(COUNT(*), ' Times') number
FROM     your_table
GROUP BY name
ORDER BY name;

测试用例:

CREATE TABLE your_table (sr int, name varchar(50));
INSERT INTO your_table VALUES(1, 'A');
INSERT INTO your_table VALUES(2, 'B');
INSERT INTO your_table VALUES(3, 'C');
INSERT INTO your_table VALUES(4, 'C');
INSERT INTO your_table VALUES(5, 'C');
INSERT INTO your_table VALUES(6, 'E');
INSERT INTO your_table VALUES(7, 'A');
INSERT INTO your_table VALUES(8, 'A');
INSERT INTO your_table VALUES(9, 'A');
INSERT INTO your_table VALUES(10, 'E');
INSERT INTO your_table VALUES(11, 'B');
INSERT INTO your_table VALUES(12, 'B');

结果:

+------+---------+
| name | number  |
+------+---------+
| A    | 4 Times |
| B    | 3 Times |
| C    | 3 Times |
| E    | 2 Times |
+------+---------+
4 rows in set (0.00 sec)

或者,如果您更喜欢单列结果集,则可能需要执行以下操作:

SELECT   CONCAT(name, ' = ', COUNT(*), ' Times') result
FROM     your_table
GROUP BY name
ORDER BY name;

结果:

+-------------+
| result      |
+-------------+
| A = 4 Times |
| B = 3 Times |
| C = 3 Times |
| E = 2 Times |
+-------------+
4 rows in set (0.00 sec)

答案 2 :(得分:1)

select count(Name) , Name
from yourtable
group by Name
order by name

答案 3 :(得分:0)

我将提供与其他语法相同的替代语法。

SQL:(Demo

SELECT Name, COUNT(1)
FROM Names
GROUP BY 1 ASC

结果集:

| Name | COUNT(1) |
| ---- | -------- |
| A    | 4        |
| B    | 3        |
| C    | 3        |
| E    | 2        |
  1. 使用group by将有效地仅返回具有唯一Name值的行。
  2. COUNT(1)将计算在GROUP BY第一列上使用SELECT生成的每个聚合中的行数-考虑聚合数据作为行的簇,必须将"flattened somehow" by a MySQL function引入到结果集中。
  3. GROUP BY将在目标列之后愉快地收到排序顺序声明,因此可以省略ORDER BY子句。

p.s。我不确定您实际上是否需要一列按您的问题所写格式预先格式化的数据,或者这只是您表达所需结果集的方式而您实际上< / em>需要两列数据,而不会显示纯文本。

如果您需要预格式化的文本版本,那么魔术1将不适用-该列需要明确引用。

SELECT CONCAT(Name, ' = ', COUNT(Name), ' Times')
FROM Names
GROUP BY Name DESC

我个人不会将CONCAT()用于此任务,除非,例如,您正在为ajax调用生成json响应(将结果集传递到另一层)。换句话说,您立即将完整的结果集包装在json_encode()中,然后返回javascript,将其直接传递给Google api以进行图形表示。

PHP文档摘录-特别是mysqli的fetch_all()

[...]仅在将获取的结果集发送到另一层进行处理的情况下使用。

否则,如果要在流中的任何点手动遍历行,则应在应用程序中的那个点处添加静态文本。这样可以使结果集更加简洁明了,并使您的应用程序维护更加容易。