Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL联接和工作不正常_Php_Mysql_Codeigniter - Fatal编程技术网

Php SQL联接和工作不正常

Php SQL联接和工作不正常,php,mysql,codeigniter,Php,Mysql,Codeigniter,我在生成查询结果时遇到问题。我想从与主表相关的另一个表中生成行结果的总和 我没有输出的是付款总额和应付款项总额 问题#1-我无法生成正确的付款输出。这个 查询似乎产生了一个numrows*付款总额的公式 问题#2-我无法生成应付款总额的输出 我正在使用Codeigniter 3,这是我的模型 function fetch_billing_records($case_id, $patient_id, $status) { $this->db->join('case

我在生成查询结果时遇到问题。我想从与主表相关的另一个表中生成行结果的总和

我没有输出的是付款总额和应付款项总额

  • 问题#1-我无法生成正确的付款输出。这个 查询似乎产生了一个
    numrows*付款总额的公式

  • 问题#2-我无法生成应付款总额的输出

我正在使用Codeigniter 3,这是我的模型

function fetch_billing_records($case_id, $patient_id, $status) {

        $this->db->join('cases', 'cases.id = billing.case_id', 'left');
        $this->db->join('patients', 'patients.id = cases.patient_id', 'left');            
        $this->db->join('users', 'users.username = billing.user', 'left');
        $this->db->join('billing_payments', 'billing_payments.billing_id = billing.id', 'left');
        $this->db->join('billing_items', 'billing_items.billing_id = billing.id', 'left');
        $this->db->join('services', 'services.title = billing_items.service', 'left');
        $this->db->select('
            billing.id,
            billing.remarks,
            billing.status,
            billing.created_at,
            billing.updated_at,
            users.name as user,
            users.username,
            cases.id as case_id,
            cases.title as case_title,
            patients.id as patient_id,
            CONCAT(patients.lastname, ", ", patients.fullname) as patient_name,
            SUM(billing_payments.amount) as payments,
            SUM((services.amount - billing_items.discount)*billing_items.qty) as payables
        ');

        if(is_int($case_id)) {
            $this->db->where('billing.case_id', $case_id);           
        }

        if(is_int($patient_id)) {
            $this->db->where('patients.id', $patient_id);
        }

        if(is_int($status)) {
            $this->db->where('billing.status', $status);
        }

        $this->db->group_by('billing.id');
        $this->db->where('billing.is_deleted', 0);

        $query = $this->db->get("billing");

        log_message('error', $this->db->last_query());
        if ($query->num_rows() > 0) {
            return $query->result_array();
        }

        return false;

}
我用最后一个查询和日志助手保存了最后一个查询,我的实例的查询似乎是

 SELECT `billing`.`id`, `billing`.`remarks`, `billing`.`status`, `billing`.`created_at`, `billing`.`updated_at`, `users`.`name` as `user`, `users`.`username`, `cases`.`id` as `case_id`, `cases`.`title` as `case_title`, `patients`.`id` as `patient_id`, CONCAT(patients.lastname, ", ", patients.fullname) as patient_name, SUM(billing_payments.amount) as payments, SUM((services.amount - billing_items.discount)*billing_items.qty) as payables
FROM `billing`
LEFT JOIN `cases` ON `cases`.`id` = `billing`.`case_id`
LEFT JOIN `patients` ON `patients`.`id` = `cases`.`patient_id`
LEFT JOIN `users` ON `users`.`username` = `billing`.`user`
LEFT JOIN `billing_payments` ON `billing_payments`.`billing_id` = `billing`.`id`
LEFT JOIN `billing_items` ON `billing_items`.`billing_id` = `billing`.`id`
LEFT JOIN `services` ON `services`.`title` = `billing_items`.`service`
WHERE `billing`.`is_deleted` =0
为了更好地指导您解决我目前的问题,以下是相关表的架构:

这是整个数据库的模式


使用group by语句。因为mysql聚合函数可以很好地与GROUPBY配合使用。如果您想要针对患者的账单金额,则使用以下查询

SELECT 
    `billing`.`id`, 
    `billing`.`remarks`, 
    `billing`.`status`, 
    `billing`.`created_at`, 
    `billing`.`updated_at`, `
    users`.`name` as `user`, 
    `users`.`username`, 
    `cases`.`id` as `case_id`, 
    `cases`.`title` as `case_title`, 
    `patients`.`id` as `patient_id`, 
    CONCAT(patients.lastname, ", ", patients.fullname) as patient_name, 
    SUM(billing_payments.amount) as payments, 
    SUM((services.amount - billing_items.discount)*billing_items.qty) as payables
FROM `billing`
    LEFT JOIN `cases` ON `cases`.`id` = `billing`.`case_id`
    LEFT JOIN `patients` ON `patients`.`id` = `cases`.`patient_id`
    LEFT JOIN `users` ON `users`.`username` = `billing`.`user`
    LEFT JOIN `billing_payments` ON `billing_payments`.`billing_id` = `billing`.`id`
    LEFT JOIN `billing_items` ON `billing_items`.`billing_id` = `billing`.`id`
    LEFT JOIN `services` ON `services`.`title` = `billing_items`.`service`
WHERE `billing`.`is_deleted` =0
GROUP BY patients.id

使用GROUPBY语句。因为mysql聚合函数可以很好地与GROUPBY配合使用。如果您想要针对患者的账单金额,则使用以下查询

SELECT 
    `billing`.`id`, 
    `billing`.`remarks`, 
    `billing`.`status`, 
    `billing`.`created_at`, 
    `billing`.`updated_at`, `
    users`.`name` as `user`, 
    `users`.`username`, 
    `cases`.`id` as `case_id`, 
    `cases`.`title` as `case_title`, 
    `patients`.`id` as `patient_id`, 
    CONCAT(patients.lastname, ", ", patients.fullname) as patient_name, 
    SUM(billing_payments.amount) as payments, 
    SUM((services.amount - billing_items.discount)*billing_items.qty) as payables
FROM `billing`
    LEFT JOIN `cases` ON `cases`.`id` = `billing`.`case_id`
    LEFT JOIN `patients` ON `patients`.`id` = `cases`.`patient_id`
    LEFT JOIN `users` ON `users`.`username` = `billing`.`user`
    LEFT JOIN `billing_payments` ON `billing_payments`.`billing_id` = `billing`.`id`
    LEFT JOIN `billing_items` ON `billing_items`.`billing_id` = `billing`.`id`
    LEFT JOIN `services` ON `services`.`title` = `billing_items`.`service`
WHERE `billing`.`is_deleted` =0
GROUP BY patients.id


你有没有把没有分组的select sum放在可能的地方?@martonohalim我有
$this->db->group_by('billing.id')我不确定代码点火器是如何工作的,但您的分组方式似乎没有足够的列来分组。它应该放置除sum列之外的所有列。希望有帮助。@AaronAlfonso试着把
false
$this->db->select(“你选择的部分”,false)似乎使用codeigniter进行选择没有问题。问题是对SQL的正确查询。您是否在没有分组依据的情况下输入了select sum?@martonohalim I did
$this->db->group_by('billing.id')我不确定代码点火器是如何工作的,但您的分组方式似乎没有足够的列来分组。它应该放置除sum列之外的所有列。希望有帮助。@AaronAlfonso试着把
false
$this->db->select(“你选择的部分”,false)似乎使用codeigniter进行选择没有问题。问题是SQL的正确查询。根据我的实例的要求,我做了一个
$this->db->group\u by('billing.id')
。但是我知道确实需要group byYes。但我试图通过命令行执行,但它有相同的输出。我相信我需要知道的是正确地查询SQLwhat result you want?我按照我的实例的要求做了一个
$this->db->group\u by('billing.id')
。但是我知道确实需要group byYes。但我试图通过命令行执行,但它有相同的输出。我相信我需要知道的是正确查询SQLServer,您想要什么结果?