2015-03-24 46 views
0

我不确定在堆栈溢出中是否没有答案,但我没有在那里找到确切的东西。 所以,我有这样的数据表:MySQL:在每个字段中计算不同的值

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更快地做到这一点?

谢谢!

回答

2

这是几个汇总查询联合的直接应用程序。一个典型的汇总查询将

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程序的性能要好一个数量级。

+0

好点,谢谢。无论如何,你认为它的表现如何,因为有3个选择?确切的说,我需要5个SELECT来计算所有这些,因为我有5个选项(不仅仅是扇区,类型和级别)。我也有所有这些领域的索引。 – 2015-03-24 21:30:01

相关问题