2013-03-12 59 views
3

我在codeigniter.Here做一个项目,我想加入三个表加入笨三个表具有一对多的关系

客户(ID,姓名,电子邮件,adminId,CAMPAIGNID,dateAdded,IS_DELETED)

campaign(id,name,adminId)and

order(id,name,cost,dateAdded,clientId)。

从这些表格中,我想选择(在两个日期之间)添加的客户端数量,广告系列名称和总订单成本。当我加入两个表格(客户端和广告系列)时,它会返回正确的结果。

我使用的查询是

$this->db->select('clients.id AS my_client, 
    clients.name AS client_name, 
    campaign.name AS campaign_name, 
    DATE(clients.dateAdded) as client_date, 
    COUNT(clients.id) AS num_rows'); 

$this->db->from('clients'); 
$this->db->where('clients.adminId', $adminId); 
$this->db->where('DATE(clients.dateAdded) >=', $from_date); 
$this->db->where('DATE(clients.dateAdded) <=', $to_date); 
$this->db->join('campaign', 'campaign.id = clients.campaignId', 'left'); 
$this->db->group_by('campaign_name'); 
$query = $this->db->get(); 
return $query->result(); 

但是,当我加入三个表(客户,广告活动,顺序)它没有返回客户和订单之间的正确result.The关系之一many.Ie一个客户端可以有不止一个order.So它不会给正确的值两个dates.The之间增加客户的总数联接查询我用来连接三个表是

$this->db->select('clients.id AS my_client, 
    clients.name AS client_name, 
    campaign.name AS campaign_name, 
    DATE(clients.dateAdded) AS client_date, 
    SUM(order.cost) AS order_cost, 
    COUNT(clients.id) AS num_rows'); 

$this->db->from('clients'); 
$this->db->where('clients.adminId', $adminId); 
$this->db->where('clients.is_deleted', 0); 
$this->db->where('DATE(clients.dateAdded) >=', $from_date); 
$this->db->where('DATE(clients.dateAdded) <=', $to_date); 
$this->db->join('campaign', 'campaign.id = clients.campaignId', 'left'); 
$this->db->join('order', 'order.clientId = clients.id', 'left'); 
$this->db->group_by('campaign_name'); 
$query = $this->db->get(); 
return $query->result(); 

任何人都可以有一些想法来做到这一点。在此先感谢

+0

你是否得到任何结果,或者只是不是你期望的结果? – Gavin 2013-03-12 10:28:19

+0

@Gavin是的,我得到了一些结果,但不是预期的结果。 – Balu 2013-03-12 10:35:32

+0

我在你的两个查询中注意到的一件事是,你在第二个查询中使用'clients.is_deleted = 0',因为你不是第一个查询。除此之外,你的查询看起来对我很好吗? – Gavin 2013-03-12 11:01:54

回答

2

我得到了通过增加对客户端的数量计数不同client.id(COUNT(DISTINCT(clients.id)))预期的结果,

$this->db->select('clients.id AS my_client, 
    clients.name AS client_name, 
    campaign.name AS campaign_name, 
    DATE(clients.dateAdded) AS client_date, 
    SUM(order.cost) AS order_cost, 
    COUNT(DISTINCT(clients.id)) AS num_rows'); //changed the code here from COUNT(clients.id) AS num_rows 

$this->db->from('clients'); 
$this->db->where('clients.adminId', $adminId); 
$this->db->where('clients.is_deleted', 0); 
$this->db->where('DATE(clients.dateAdded) >=', $from_date); 
$this->db->where('DATE(clients.dateAdded) <=', $to_date); 
$this->db->join('campaign', 'campaign.id = clients.campaignId', 'left'); 
$this->db->join('order', 'order.clientId = clients.id', 'left'); 
$this->db->group_by('campaign_name'); 
$query = $this->db->get(); 
return $query->result(); 

我不认为这是正确的way.Is有任何更好的方式来做到这一点。感谢您的支持。

相关问题