Манипулирование результатом запроса для отображения данных MAX, сгруппированных по полю - PullRequest
0 голосов
/ 06 октября 2009

Вот мой существующий запрос:

$Pareto = mysql_query("SELECT
            zsca_open.tqs_batch_num AS 'Batch Number',
            ft_tests.test_name AS 'Test Name',
            (SUM(ft_stats.over_filter + ft_stats.under_filter)) AS 'Failures'
        FROM
            ((zsca_open INNER JOIN ft_header ON zsca_open.tqs_batch_num = ft_header.batch_code)
            INNER JOIN ft_tests ON ft_header.serial_hi = ft_tests.serial_hi) 
            INNER JOIN ft_stats ON ft_tests.serial_si = ft_stats.serial_si
        WHERE
            (((zsca_open.vendor)='ASE')
            AND ((zsca_open.lot_type)='T')
            AND ((zsca_open.status)='H')
            AND ((zsca_open.is_active)=1)
            AND ((zsca_open.rec_ver)=0)
            AND ((ft_header.test_step)='PROD')
            AND ((ft_header.status)='VIRGIN')
            AND ((ft_stats.stats_name)='spec_stats'))
        GROUP BY
            zsca_open.tqs_batch_num,
            ft_tests.test_name
        HAVING
             (((ft_tests.test_name) Not In ('SW Bin','HW Bin','Pass')))
        ORDER BY
            SUM(ft_stats.over_filter + ft_stats.under_filter) DESC") or die(mysql_error());

ЗДЕСЬ ВЫХОД:

Batch Number TestName Failures <br>
0938AT5213   PCS_Pout 2865 <br>
0939AT5228 LB_PAE 921 <br>
0938AT5213 DCS_Pout 769 <br>
0939AT5228 LB_Pout_Nom 730 <br>
0939AT5228 LB_Pout 642 <br>
0938AT5213 DCS_PAE 517 <br>
0919AT3366 Iswitch 513 <br>
0938AT5213 PCS_PAE 481 <br>
0939AT5228 RX2_Insert_Loss 474 <br>
0939AT5228 HB_PAE 470 <br>
0939AT5228 HB_Pout 434 <br>
0939AT5228 HB_Pout_Nom 426 <br>
0919AT3366 ACLR1L_H1_846p6 399 

Вывод, который мне нужен, должен показывать только MAX Failures на номер партии.

Batch Number test_name Failures <br>
0938AT5213 PCS_Pout 2865 <br>
0939AT5228 LB_PAE 921<br>
0919AT3366 Iswitch 513

Можно мне помочь с запросом? Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 06 октября 2009

В MySQL вы можете вкладывать запросы, поэтому вы можете обрабатывать результат вашего первоначального запроса как временную таблицу, например:

SELECT
        batches.'Batch Number',
        tests.'Test Name',
        batches.'Failures'
FROM
(
        SELECT
                zsca_open.tqs_batch_num AS 'Batch Number',
                MAX(SUM(ft_stats.over_filter + ft_stats.under_filter)) AS 'Failures'
        FROM
                ((zsca_open INNER JOIN ft_header ON zsca_open.tqs_batch_num = ft_header.batch_code)
                INNER JOIN ft_tests ON ft_header.serial_hi = ft_tests.serial_hi)
                INNER JOIN ft_stats ON ft_tests.serial_si = ft_stats.serial_si
        WHERE
                (((zsca_open.vendor)='ASE')
                AND ((zsca_open.lot_type)='T')
                AND ((zsca_open.status)='H')
                AND ((zsca_open.is_active)=1)
                AND ((zsca_open.rec_ver)=0)
                AND ((ft_header.test_step)='PROD')
                AND ((ft_header.status)='VIRGIN')
                AND ((ft_stats.stats_name)='spec_stats'))
        GROUP BY
                zsca_open.tqs_batch_num
        HAVING
                (((ft_tests.test_name) Not In ('SW Bin','HW Bin','Pass')))
) batches
INNER JOIN ft_header ON tests.'Batch Number' = ft_header.batch_code
INNER JOIN (
        SELECT
                ft_tests.serial_hi,
                ft_tests.test_name AS 'Test Name',
                SUM(ft_stats.over_filter + ft_stats.under_filter) AS 'Failures'
        FROM
                ft_tests
        GROUP BY
                ft_tests.serial_hi,ft_tests.test_name
) tests ON (ft_header.serial_hi = tests.serial_hi AND test.'Failures' = bartches.'Failures')

Это первое предположение, но по сути это результат написания различных «представлений», необходимых для выполнения запроса за один раз, а затем обработки операторов SELECT как таблиц.

Это также может быть весьма неэффективно, поэтому вы можете рассмотреть альтернативные методы, такие как использование MySQLs views или выполнение окончательного агрегирования в коде.

Если вам нужна дополнительная информация о методике, использованной в моем запросе, посмотрите эту страницу на сайте MySQL.

0 голосов
/ 06 октября 2009

это действительно легко, если вам не нужно поле test_name. если это так, просто оберните весь запрос в:

SELECT `Batch Number`, max(Failures) from (**YOURQUERYHERE**) as myquery GROUP BY Failures;

это даст вам максимальное количество сбоев по номеру партии, но не даст вам test_name, которое соответствует максимальному количеству сбоев. чтобы получить test_name, вам нужно выполнить соединение подзапроса, как показано здесь . Или здесь .

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

CREATE TEMPORARY TABLE mytable (batch varchar(30), testname varchar(30), failures INT);
INSERT INTO mytable (**YOURQUERYHERE**);

тогда вы можете получить максимум, выполнив один из шагов, рекомендованных для этих ссылок. например:

SELECT t1.batch, t1.testname, t1.failures
  FROM mytable AS t1,
       (SELECT batch, MAX(failures) AS maxfail
          FROM mytable
         GROUP BY batch) AS t2
  WHERE t2.batch = t1.batch
        AND t1.failures = t2.maxfail;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...