2012-07-06 79 views
0

我有兩個包含類似數據的數據庫表 - 其中一個是進程完成的工作量,另一個是該進程發生的錯誤數量。從mySQL查詢中收集兩個單獨的列結果

我想顯示正確的第一次工作的百分比。

我通過工藝計算的項目數查詢:

SELECT Counter.Process, count(Counter.Process) AS count 
          FROM Counter WHERE (TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59') 
          GROUP BY Counter.Process 
          ORDER BY count DESC 

上面給了我類似的列表:

Process | count 
------------------- 
Process A | 40 
Process B | 32 
Process C | 102 
Process D | 23 

我有第二個表與它相同的字段用於記錄錯誤,稱爲「錯誤」。

通過使用相同的查詢(但明顯改變表名),我可以得到一個進程和錯誤的列表。

我想要做的是創建一個PHP網頁,顯示每個進程的錯誤百分比。

我的問題是,如果我分別創建兩個查詢,當我使用PHP Where循環遍歷它們時,我不知道如何使計算顯示百分比。

我試着在兩個SQL查詢之間使用UNION,但是我無法讓它顯示出針對該過程的兩個不同的計數讀數。

理想情況下,我想一個方法來顯示這樣的數據:

Process | Counter.count | Errors.count 
Process A  40    2 
Process B  32    0 
Process C  102    18 
Process D  23    8 

我真的很感激任何意見/建議,我怎麼能做到這一點 - 如果你需要我的數據庫的詳細信息表,請讓我知道

感謝您閱讀

小號

回答

-1

你可以使用子查詢:

SELECT Counter.Process, count(Counter.Process) AS Count, 
     (SELECT count(Errors.Process) 
     FROM Errors 
     WHERE Process=Counter.Process 
      AND (TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59')) AS Errors 
          FROM Counter WHERE (TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59') 
          GROUP BY Counter.Process 
          ORDER BY count DESC 

Regards, Neil。

+0

不,他應該加入兩個表,使用內部連接,並獲得他需要的結果集。 – 2012-07-06 19:36:21

+0

從我可以看到尼爾,你的建議確實是我需要的。真相,你能解釋一下加盟會提供哪些Neils解決方案沒有的?感謝您的幫助! – user1507535 2012-07-06 19:41:12

+0

查詢沒有問題。如果你在流程專欄上有索引,那也很不錯。否則,聯接解決方案可能會更好。要使沒有索引的計數需要在第一個表上對組中返回的每一行的錯誤表執行全表掃描。在這種情況下,聯接解決方案可能會更好,因爲每個表只能掃描一次。如果表中的數據不是很大,那麼即使沒有索引,查詢也可以。 – 2012-07-06 19:55:05

0

我沒有運行它,所以可能會有錯誤。你可以使兩個選擇,和左連接的結果:

select s.process, s.success_count, e.error_count 
from 
(SELECT Counter.Process as process, count(Counter.Process) AS success_count 
FROM Counter 
WHERE (TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59') 
GROUP BY Counter.Process 
) s left join 
(SELECT Errors.Process, count(Errors.Process) AS error_count 
     FROM Errors 
     WHERE (TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59') 
     GROUP BY Errors.Process 
) e 
on (s.Process = e.process) 
0

我個人更喜歡來用PHP執行這樣的情況,因爲它混淆了我少,所以我將解釋如何,我認爲我會做它在PHP(我說「想」,因爲我可能不知道一些關於你的數據庫結構或系統規範,這將使我的事情,否則):

$rows = array(); 
$res = mysql_query('SELECT Counter.Process, count(Counter.Process) AS count 
         FROM Counter WHERE (TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59') 
         GROUP BY Counter.Process 
         ORDER BY count DESC'); 
while ($arr = mysql_fetch_assoc($res)) 
{ 
    $rows[] = $arr; 
} 

$res2 = mysql_query('SELECT Errors.Process, count(Errors.Process) AS count 
         FROM Counter WHERE (TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59') 
         GROUP BY Errors.Process 
         ORDER BY count DESC'); 
while ($arr2 = mysql_fetch_assoc($res2) 
{ 
    for ($i=0; $i<count($rows); $i++) 
    { 
     if ($arr2["Process"] == $data[$i]["process"]) 
     { 
      break; 
     } 
     //Do your functions with $arr and $data[$i] at this point... 
    } 
} 
+0

在PHP中做它是好的,但數據庫服務器是專門爲處理這些情況以最有效的方式。此外,您將傳輸的數據量少得多,因此在這方面也會更快。 – databyss 2012-07-06 19:57:32

0

沒有一個子查詢做它應該是簡單的:

SELECT 
    Counter.Process 
    , COUNT(Counter.Process) AS ProcessCount 
    , COUNT(Errors.Process) AS ProcessErrors 
FROM 
    Counter 
    LEFT JOIN 
    Errors 
    ON Counter.Process = Errors.Process 
WHERE 
    Counter.TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59' 
GROUP BY 
    Counter.Process 

您可以對這兩個查詢進行解釋,以查看哪些數據最適合您的數據。

-edit:我已將它更改爲LEFT JOIN,因此如果進程沒有錯誤,則不會錯過行。

+0

如果第一個表有4行,第二個有兩個,會發生什麼?加入之後,你將有8行和分組,這將給8的計數。 – 2012-07-06 20:07:01

相關問題