2012-07-06 4 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, я не знаю, как сделать вычисление для отображения процента.

Я попытался использовать UNION между двумя SQL-запросами, но я не могу заставить его показать два разных отсчета отсчета против этого процесса.

В идеале я хотел бы способ, чтобы показать данные, как это:

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

Я бы очень признателен за любые советы/предложения относительно того, как я могу сделать это - если вам нужно больше информации о моей базе данных таблицы, пожалуйста, дайте мне знать

Спасибо за чтение

S

ответ

-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 

С уважением, Neil.

+0

Нет, он должен ПРИСОЕДИНИТЬСЯ к двум столам, используя внутреннее соединение, и получить нужный ему набор результатов. –

+0

Из того, что я вижу Нила, ваше предложение делает именно то, что мне нужно. Правда, можете ли вы объяснить, что Join предложит, что решение Neils не делает? Спасибо и за вашу помощь! – user1507535

+0

В этом вопросе нет ничего плохого. если у вас есть индексы в столбце процесса, это также очень хорошо. в противном случае решение соединения может быть лучше. чтобы подсчет без индексов потребовал бы полного сканирования таблицы в таблице ошибок для каждой строки, возвращаемой в группе, по первой таблице. в этом случае решение соединения может быть лучше, поскольку каждая таблица сканируется только один раз. если данные в таблице невелики, тогда запрос может быть даже без индексов. –

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

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. –

Смежные вопросы