我只是想问一下如何在这个SQL语法
之后在CakePHP中进行查询连接SELECT a.id, SUM( r.jumlah_realisasi) AS jumlah_realisasi, SUM(b.jumlah_budget) AS jumlah_budget, SUM(c.jumlah_contrapos)
FROM accountposts a
LEFT JOIN
(
SELECT accountpost_id, agency_id, SUM(budget_after_changes) AS jumlah_budget
FROM budgets
GROUP BY accountpost_id
) b
ON a.id = b.accountpost_id
LEFT JOIN
(
SELECT accountpost_id, agency_id, SUM(realisation_value) AS jumlah_realisasi
FROM realisations
GROUP BY accountpost_id
) r
ON a.id = r.accountpost_id
LEFT JOIN
(
SELECT accountpost_id, agency_id, SUM(contrapos_value) AS jumlah_contrapos
FROM contraposts
GROUP BY accountpost_id
) c
ON a.id = c.accountpost_id
GROUP BY
a.id
我尝试使用这种语法(我使用CakePHP 2.x):
$joins = array(
array(
'table' => 'budgets',
'alias' => 'Budget',
'type' => 'LEFT',
'conditions' => array('Accountpost.id = Budget.accountpost_id')
),
array(
'table' => 'realisations',
'alias' => 'Realisation',
'type' => 'LEFT',
'conditions' => array('Accountpost.id = Realisation.accountpost_id')
),
array(
'table' => 'contraposts',
'alias' => 'Contrapost',
'type' => 'LEFT',
'conditions' => array('Accountpost.id = Contrapost.accountpost_id')
),
);
$this->paginate = array(
'limit' => 60,
'joins' => $joins,
'fields' => array('Accountpost.id','Accountpost.explanation','Accountpost.account_code',
'SUM(Budget.budget_after_changes) AS jumlah_budget','SUM(Realisation.realisation_value) AS jumlah_realisasi','SUM(Contrapost.contrapos_value) AS jumlah_contrapos'),
'group' => array('Accountpost.id'),
'order' => array('Accountpost.id' => 'ASC'),
);
这是CakePHP的SQL Dump:
SELECT `Accountpost`.`id`, `Accountpost`.`explanation`, `Accountpost`.`account_code`, SUM(`Budget`.`budget_after_changes`), `Budget`.`budget_after_changes`, `Realisation`.`realisation_value`, `Contrapost`.`contrapos_value` FROM `realisasi_anggaran`.`accountposts` AS `Accountpost` LEFT JOIN `realisasi_anggaran`.`budgets` AS `Budget` ON (`Accountpost`.`id` = `Budget`.`accountpost_id`) LEFT JOIN `realisasi_anggaran`.`realisations` AS `Realisation` ON (`Accountpost`.`id` = `Realisation`.`accountpost_id`) LEFT JOIN `realisasi_anggaran`.`contraposts` AS `Contrapost` ON (`Accountpost`.`id` = `Contrapost`.`accountpost_id`) WHERE 1 = 1 GROUP BY `Accountpost`.`id` ORDER BY `Accountpost`.`id` ASC LIMIT 60
但SQL语法版本和CakePHP版本之间的结果不同,在SQL语法中,在检查SUM时没有重复值,但在CakePHP版本中,在检查SUM时存在重复值。如何以正确的方式实现我的SQL语法到cakePHP?
答案 0 :(得分:0)
您的$options
数组构造错误。这样,数组有两个嵌套的命名键,名为joins
,而Cake不会构造正确的SQL连接。
数组应该如下所示:
$joins = array(
array(
'table' => 'budgets',
'alias' => 'Budget',
'type' => 'LEFT',
'conditions' => array('Accountpost.id = Budget.accountpost_id')
)
);
$this->paginate = array(
'limit' => 60,
'joins' => $joins,
'fields' => array('Accountpost.id','Accountpost.explanation','Accountpost.account_code',
'SUM(Budget.budget_after_changes) AS jumlah_budget'),
'group' => array('Accountpost.id'),
'order' => array('Accountpost.id' => 'ASC'),
);
或构建如下:
$options = array(
'limit' => 60,
'fields' => array('Accountpost.id','Accountpost.explanation','Accountpost.account_code',
'SUM(Budget.budget_after_changes) AS jumlah_budget'),
'group' => array('Accountpost.id'),
'order' => array('Accountpost.id' => 'ASC'),
);
$options['joins'] = array(
array(
'table' => 'budgets',
'alias' => 'Budget',
'type' => 'LEFT',
'conditions' => array('Accountpost.id = Budget.accountpost_id')
)
);
$this->paginate = $options;