php - MySQL:计算每个字段中的不同值

标签 php mysql select count

我不确定 Stack Overflow 上是否没有答案,但我没有在那里找到确切的东西。 所以,我有一个包含如下数据的表:

id    | sector | type  | level
      |        |       |
1     | TMT    | Long  | First
2     | Energy | Long  | Second
3     | TMT    | Short | Third
4     | Other  | Long  | First
5     | TMT    | N/A   | Sixth
6     | Other  | Short | First

我需要的是每个字段中每个不同值的摘要,如下所示:

Sector TMT: 3
Sector Energy: 1
Sector Other: 2
Type Long: 3
Type Short: 2
Type N/A: 1
Level First: 3
Level Second: 1
Level Third: 1
Level Sixth: 1

类型和级别具有固定值。部门可能是动态的,我的意思是没有最终列表,因为它们随每个项目一起添加。

现在我选择所有行并使用 PHP 处理它:

SELECT `sector`, `type`, `level` FROM `table`;

例如:

<?php
$result['type_long'] = 0;
$result['type_short'] = 0;
$result['type_na'] = 0;
foreach ($rows as $row)
{
    if ($row['type'] == 'Long')
    {
        $result['type_long']++;
    }
    else if ($row['type'] == 'Short')
    {
        $result['type_short']++;
    }
    else if ($row['type'] == 'N/A')
    {
        $result['type_na']++;
    }
}

等等。对于 10000 条记录,速度并不是很快,因为我需要从数据库中选择所有行,然后通过 PHP 对它们执行某些操作。

有什么方法可以使用 MySQL 更快地完成此操作吗?

谢谢!

最佳答案

这是多个汇总查询联合的简单应用。典型的摘要查询是

SELECT Sector, COUNT(*) cnt
  FROM mytable
 GROUP BY Sector

要获得确切的结果集,您可以执行以下操作:

SELECT CONCAT('Sector ', Sector, ':') item, COUNT(*) cnt FROM mytable GROUP BY Sector
UNION ALL
SELECT CONCAT('Type ', Type, ':') item, COUNT(*) cnt FROM mytable GROUP BY Type
UNION ALL
SELECT CONCAT('Level', Level, ':') item, COUNT(*) cnt FROM mytable GROUP BY Level

如果您希望达到最佳速度,您可以尝试在三列上添加索引。

MySQL 非常擅长以高性能处理汇总查询。即使在此 UNION 中有多个单独的 SELECT 查询,它的执行效果也比将所有原始数据行从服务器传输到 MySQL 程序要好一个数量级。

关于php - MySQL:计算每个字段中的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29243039/

相关文章:

jquery - 为什么 $ (":select").focus 不起作用,而 $ (":input").focus 起作用?

甲骨文 - 除了错误

php - 单击<a> href链接后如何插入数据库?

php - 使用 PhP 通过 SQL 进行搜索

php - 在 PHP 中渲染波形 - 如何生成更压缩的渲染?

mysql - 当我将 sails js 连接到 mysql 时出现错误( Node - v7.5.0)

python - sqlalchemy + MySQL 连接超时

php - Mysqli 多表操作

php - 在 MySQL 树中搜索具有多对多关联的项

mysql - Mysql中通过注释选择存储过程名称