On 5/29/06, Cory Robin wrote:

SELECT pnr.ID ID_pnr, pnr.reservationdatetime, pnr.conf_number,
pnr.created_by,
        GROUP_CONCAT(pp.name_last,', ',pp.name_first ORDER BY name_last
DESC SEPARATOR '<br>') names,
        (SELECT SUM(pf.base_fare*(SELECT COUNT(1) FROM pnr_passengers pp
WHERE pp.ID_pnr=pnr.ID )) FROM pnr_fares pf WHERE pf.ID_pnr=pnr.ID )
base_fare,
        (SELECT SUM(pf.tax*(SELECT COUNT(1) FROM pnr_passengers pp WHERE
pp.ID_pnr=pnr.ID )) FROM pnr_fares pf WHERE pf.ID_pnr=pnr.ID ) tax ,
        (SELECT SUM(psf.segfee_amount*(SELECT COUNT(1) FROM
pnr_passengers pp WHERE pp.ID_pnr=pnr.ID )) FROM pnr_segments_fees psf
INNER JOIN pnr_segments pss ON psf.ID_segments=pss.ID WHERE
psf.segfee_code='XF' AND pss.ID_pnr=pnr.ID ) XF ,
        (SELECT SUM(amount_value) service_fees FROM pnr_service_fees
WHERE ID_pnr=pnr.ID) services ,
        (SELECT SUM(amount) FROM pnr_payments_credits WHERE
ID_pnr=pnr.ID AND bln_payment='1' AND transaction_type='sale') payments,
        (SELECT SUM(amount) FROM pnr_payments_credits WHERE
ID_pnr=pnr.ID AND bln_payment='1' AND transaction_type='credit') credits
    FROM pnr INNER JOIN pnr_passengers pp
        ON pnr.ID=pp.ID_pnr
    WHERE pnr.reservationdatetime>='2000-05-29 00:00:00'
    AND pnr.reservationdatetime<='2006-05-29 23:59:59'
GROUP BY pnr.ID
ORDER BY reservationdatetime;

One way to avoid the repeated COUNT might be to use a nested FROM that
pre-calculates the count as a pseudo-column:
SELECT
        pnr_precalc.ID ID_pnr,
        pnr_precalc.reservationdatetime,
        pnr_precalc.conf_number,
        pnr_precalc.created_by,
        GROUP_CONCAT(pp.name_last,', ',pp.name_first ORDER BY name_last DESC
SEPARATOR '<br>') names,
        (SELECT SUM(pf.base_fare * pnr_precalc.passengercount) FROM pnr_fares
pf WHERE pf.ID_pnr=pnr_precalc.ID ) base_fare,
        (SELECT SUM(pf.tax*pnr_precalc.passengercount) FROM pnr_fares pf
WHERE pf.ID_pnr=pnr_precalc.ID ) tax ,
        (
                SELECT SUM(psf.segfee_amount*pnr_precalc.passengercount)
                FROM pnr_segments_fees psf INNER JOIN pnr_segments pss ON
psf.ID_segments=pss.ID
                WHERE psf.segfee_code='XF' AND pss.ID_pnr=pnr_precalc.ID
        ) XF,
        (SELECT SUM(amount_value) service_fees FROM pnr_service_fees WHERE
ID_pnr=pnr_precalc.ID) services ,
        (SELECT SUM(amount) FROM pnr_payments_credits WHERE
ID_pnr=pnr_precalc.ID AND bln_payment='1' AND transaction_type='sale')
payments,
        (SELECT SUM(amount) FROM pnr_payments_credits WHERE
ID_pnr=pnr_precalc.ID AND bln_payment='1' AND
transaction_type='credit') credits

FROM
        (
                SELECT
                        pnr.ID ID_pnr,
                        pnr.reservationdatetime,
                        pnr.conf_number,
                        pnr.created_by,
                        (SELECT COUNT(1) FROM pnr_passengers pp WHERE 
pp.ID_pnr=pnr.ID )
passengercount
                FROM
                                pnr
        ) pnr_precalc
                INNER JOIN pnr_passengers
        pp
                ON pnr.ID=pp.ID_pnr
WHERE
        pnr_precalc.reservationdatetime >= '2000-05-29 00:00:00'
                AND
        pnr_precalc.reservationdatetime <= '2006-05-29 23:59:59'
GROUP BY
        pnr_precalc.ID
ORDER BY
        reservationdatetime;
(You probably have to fix this since I can not test it.)


If you see too many loops over pnr_service_fees and
pnr_payments_credits in your explain output you can rework them in the
same way. If this doesn't help, we are going to need a lot more from
the schema and the explain output.

Jochem

Reply via email to