Extraño comportamiento de grupo por consulta que debe optimizarse
¿Puede alguien ayudarme a optimizar esta consulta?
<code>SELECT `debit_side`.`account_code` CODE, GROUP_CONCAT(DISTINCT accounts.name) AS DebitAccount, GROUP_CONCAT(debit_side.amount) AS DebitAmount, GROUP_CONCAT(transaction_info.voucher_date) AS DebitVoucherDate, (SELECT GROUP_CONCAT(DISTINCT accounts.name) FROM (accounts) LEFT JOIN debit_side ON accounts.code = debit_side.account_code LEFT JOIN credit_side ON debit_side.transaction_id_dr = credit_side.transaction_id_cr LEFT JOIN transaction_info ON transaction_info.transaction_id = credit_side.transaction_id_cr GROUP BY credit_side.account_code HAVING credit_side.account_code = `Code`) AS CreditAccount, (SELECT GROUP_CONCAT(credit_side.amount) AS CreditAmount FROM (accounts) LEFT JOIN debit_side ON accounts.code = debit_side.account_code LEFT JOIN credit_side ON debit_side.transaction_id_dr = credit_side.transaction_id_cr LEFT JOIN transaction_info ON transaction_info.transaction_id = credit_side.transaction_id_cr GROUP BY credit_side.account_code HAVING credit_side.account_code = `Code`) AS CreditAmount, (SELECT GROUP_CONCAT(transaction_info.voucher_date) AS CreditVoucherDate FROM (accounts) LEFT JOIN debit_side ON accounts.code = debit_side.account_code LEFT JOIN credit_side ON debit_side.transaction_id_dr = credit_side.transaction_id_cr LEFT JOIN transaction_info ON transaction_info.transaction_id = credit_side.transaction_id_cr GROUP BY credit_side.account_code HAVING credit_side.account_code = `Code`) AS CreditVoucherDate FROM (`accounts`) LEFT JOIN `credit_side` ON `accounts`.`code` = `credit_side`.`account_code` LEFT JOIN `debit_side` ON `debit_side`.`transaction_id_dr` = `credit_side`.`transaction_id_cr` LEFT JOIN `transaction_info` ON `transaction_info`.`transaction_id` = `credit_side`.`transaction_id_cr` GROUP BY `debit_side`.`account_code` HAVING `Code` IS NOT NULL ORDER BY `debit_side`.`account_code` ASC </code>
En realidad, en esta consulta estoy intentando obtener datos para el lado de débito y el lado de crédito para todas las cuentas. Debe haber notado que las consultas secundarias se repiten pero seleccionando columnas diferentes. Esta consulta está obteniendo resultados perfectos, pero quiero que se optimice. Aquí está el enlace a mi esquema
http://www.sqlfiddle.com/#!2/82274/6
Anteriormente tuve estas dos consultas que traté de combinar
<code>SELECT debit_side.account_code DebitCode, group_concat(distinct accounts.name) as DebitAccount, group_concat(debit_side.amount) as DebitAmount, group_concat(transaction_info.voucher_date) as DebitVoucherDate FROM (`accounts`) LEFT JOIN `credit_side` ON `accounts`.`code` = `credit_side`.`account_code` LEFT JOIN `debit_side` ON `debit_side`.`transaction_id_dr` = `credit_side`.`transaction_id_cr` LEFT JOIN `transaction_info` ON `transaction_info`.`transaction_id` = `credit_side`.`transaction_id_cr` GROUP BY `debit_side`.`account_code` ORDER BY `debit_side`.`account_code` ASC </code>
Y
<code>SELECT credit_side.account_code CreditCode, group_concat(distinct accounts.name) as CreditAccount, group_concat(credit_side.amount) as CreditAmount, group_concat(transaction_info.voucher_date) as CreditVoucherDate FROM (`accounts`) LEFT JOIN `debit_side` ON `accounts`.`code` = `debit_side`.`account_code` LEFT JOIN `credit_side` ON `debit_side`.`transaction_id_dr` = `credit_side`.`transaction_id_cr` LEFT JOIN `transaction_info` ON `transaction_info`.`transaction_id` = `credit_side`.`transaction_id_cr` GROUP BY `credit_side`.`account_code` ORDER BY `credit_side`.`account_code` ASC </code>
También quiero eliminar el registro nulo que se está recuperando. Nota: También debe tener en cuenta que en las consultas secundarias estoy usando condiciones un poco diferentes que resultan de acuerdo con mis requisitos.
EDICIONES
He cubierto el problema para eliminar el registro nulo, pero la optimización aún se mantiene.
NUEVOS EDITOS
Aquí es lo que he intentado con semi unirse
<code>SELECT `lds`.`account_code` DebitCode, group_concat(distinct la.name) as DebitAccount, group_concat(lds.amount) as DebitAmount, group_concat(lti.voucher_date) as DebitVoucherDate, `rcs`.`account_code` CreditCode, group_concat(distinct ra.name) as CreditAccount, group_concat(rcs.amount) as CreditAmount, group_concat(rti.voucher_date) as CreditVoucherDate FROM accounts as la LEFT join accounts as ra ON ra.`code` = la.`code` LEFT JOIN `credit_side` as lcs ON `la`.`code` = `lcs`.`account_code` LEFT JOIN `debit_side` as lds ON `lds`.`transaction_id_dr` = `lcs`.`transaction_id_cr` LEFT JOIN `transaction_info` as lti ON `lti`.`transaction_id` = `lcs`.`transaction_id_cr` LEFT JOIN `debit_side` as rds ON `ra`.`code` = `rds`.`account_code` LEFT JOIN `credit_side` rcs ON `rds`.`transaction_id_dr` = `rcs`.`transaction_id_cr` LEFT JOIN `transaction_info` as rti ON `rti`.`transaction_id` = `rcs`.`transaction_id_cr` GROUP BY `CreditCode` HAVING `CreditCode` IS NOT NULL ORDER BY `CreditCode` ASC </code>
Lo extraño es que si cambio de grupo teniendo y ordenando con DebitCode, esto trae registros perfectos para el lado de débito y si lo cambio con CreditCode si trae registros perfectos para el lado de crédito. ¿Hay alguna forma de superar este problema o alguna alternativa?