2012-04-20 83 views
3

我有以下两个mysql查询,我试图将它们合并为一个。将两个查询合并为一个而不使用UNION ALL

查询1:

$getData = $this->db->query("SELECT *,accounts.name AS DebitAccountName ,debit_side.amount AS DebitAmount 
    FROM credit_side 
    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 
    LEFT JOIN accounts ON accounts.code = credit_side.account_code 
    WHERE debit_side.account_code='1001'"); 

查询2:

$getData = $this->db->query(SELECT *,accounts.name AS CreditAccountName,credit_side.amount AS CreditAmount 
    FROM debit_side 
    LEFT JOIN credit_side ON debit_side.transaction_id_dr = credit_side.transaction_id_cr 
    LEFT JOIN transaction_info ON transaction_info.transaction_id = debit_side.transaction_id_dr 
    LEFT JOIN accounts ON accounts.code = debit_side.account_code 
    WHERE credit_side.account_code='1001'"); 

我已经试过UNION ALL但这其实不是在这种情况下工作,问题是,当我赞同$DebitAccountName它显示的结果$CreditAccountName以及我不想要的。

我使用Codeigniter,并在我的视图文件中,我旨在回显这样的结果。

<?php if(count($records) > 0) { ?> 

<?php foreach ($records as $row){ ?> 

<?php echo $row['DebitAccountName']; ?> 
    <?php echo $row['DebitAmount']; ?> 

<?php echo $row['CreditAccountName']; ?> 
    <?php echo $row['CreditAmount']; ?> 

请您帮助我把两个查询合并为一个?

感谢提前:)

回答

5

我已经联合这些queryies

 $data = array(
        '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) as CreditAccount 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' 

       ); 
    $this->db->select($data); 
    $this->db->from('accounts'); 
    $this->db->join('credit_side','accounts.code = credit_side.account_code','left'); 
    $this->db->join('debit_side','debit_side.transaction_id_dr = credit_side.transaction_id_cr','left'); 
    $this->db->join('transaction_info','transaction_info.transaction_id = credit_side.transaction_id_cr','left'); 
    $this->db->group_by('debit_side.account_code'); 
    $this->db->order_by('debit_side.account_code','ASC'); 
    $query = $this->db->get(); 
    return $query->result_array(); 

在这里看到那么编辑过

How to create General Ledger/T-Account using PHP Mysql

下面是这个查询感谢的修改和优化版本@vyegorov

Strange Behaviour of Group by in Query which needs to be optimized

+0

你检查了答案吗? – 2012-04-23 11:17:31

+0

我不能够感谢你。它的工作现在虽然没有显示一个信息,但我认为我可以从这里处理它。我也必须在我的视图文件中进行一些调整。你是一个了不起的开发者,你已经帮了我很多了,谢谢你。 – 2012-04-23 11:18:13

+0

它花了我近三天,并通过debit_side.account_code是我发现的最重要的事情 – 2012-04-23 11:20:12

1

你为什么不使用两个表(debit_side和credit_side)SELECT?当然,每个表格都需要所有JOIN。

+0

你是想说我应该这样做 - >> SELECT * FROM((query1)AND(query2))??我试过这个,但是显示错误。你能否向我展示你的意思?谢谢:) – 2012-04-20 03:54:39

+0

如果你尝试什么'SELECT *,accounts.name AS DebitAccountName,debit_side.amount AS DebitAmount,credit_side.amount AS CreditAmount FROM credit_side 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 LEFT JOIN帐户ON accounts.code = credit_side.account_code WHERE debit_side.account_code ='1001'' – temni 2012-04-20 04:04:31

+0

感谢Temni的回复。我试过你的代码,但它显示$ row ['DebitAccountName']的值; AND $ row ['DebitAmount']; 但不是$ row ['CreditAccountName']; AND $ row ['CreditAmount']; – 2012-04-20 04:10:06

1

为了简单起见,我已经离开了transaction_info JOIN:,

SELECT debacc.name AS DebitAccountName, debit_side.amount AS DebitAmount, 
    credacc.name AS CreditAccountName, credit_side.amount AS CreditAmount 
FROM debit_side 
LEFT JOIN credit_side ON debit_side.transaction_id_dr = credit_side.transaction_id_cr 
LEFT JOIN accounts credacc ON credacc.code = credit_side.account_code 
LEFT JOIN accounts debacc ON debacc.code = debit_side.account_code 
WHERE debit_side.account_code='1001' 

此查询引用了账表两次,一次为借方一次贷方。这使您可以显示交易双方的信息。