2012-07-06 56 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

相关问题