Strange Behavior of Group by in Query, które należy zoptymalizować
Czy ktoś może mi pomóc zoptymalizować to zapytanie
<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>
Właściwie w tym zapytaniu próbuję uzyskać dane dotyczące strony debetowej i kredytowej dla wszystkich kont. Musisz zauważyć, że zapytania podrzędne są powtarzane, ale wybierają różne kolumny. To zapytanie zapewnia doskonałe wyniki, ale chcę, aby zostało zoptymalizowane. Oto link do mojego schematu
http://www.sqlfiddle.com/#!2/82274/6
Wcześniej miałem te dwa zapytania, które próbowałem połączyć
<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>
I
<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>
Chcę także usunąć zapis zerowy, który jest pobierany. Uwaga: Należy również pamiętać, że w zapytaniach podrzędnych używam nieco innych warunków, które wynikają z moich wymagań.
EDYTOWANIE
Pokonałem problem, aby usunąć rekord zerowy, ale optymalizacja pozostała bez zmian.
NOWE EDYTY
Oto, co próbowałem z semi join
<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>
Dziwną rzeczą jest to, że jeśli zmienię grupę poprzez posiadanie i zamówienie przy pomocy DebitCode, to przyniesie to doskonałe zapisy po stronie debetowej i jeśli zmienię to za pomocą CreditCode, jeśli przyniesie to doskonałe zapisy dotyczące strony kredytowej. Czy jest jakiś sposób na rozwiązanie tego problemu lub jakiejkolwiek alternatywy.