2015-03-24 74 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

相關問題