3

codeigniterでプロジェクトを行っています。ここで3つのテーブルを結合したいと思います。

クライアント(id、name、email、adminId、campaignId、dateAdded、is_deleted)

キャンペーン(id、name、adminId)および

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

これらのテーブルから、追加されたクライアントの数、キャンペーン名、およびクライアントの合計注文コストを(2つの日付の間に)選択したいと思います.2つのテーブル(クライアントとキャンペーン)を結合すると、正しい結果が返されます。

私が使用したクエリは

$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();

しかし、3つのテーブル(クライアント、キャンペーン、注文)を結合すると、正しい結果が返されません。クライアントと注文の関係は1対多です。つまり、1つのクライアントが複数の注文を持つことができるため、合計の正しい値が得られません。 2つの日付の間に追加されたクライアントの数。3つのテーブルを結合するために使用した結合クエリは

$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();

誰かがこれを行うためのアイデアを持っていますか?

4

1 に答える 1

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();

これが正しい方法だとは思いません。これを行うためのより良い方法はありますか。ご支援いただきありがとうございます。

于 2013-03-13T04:15:33.237 に答える