2010-11-18 96 views
0

我有一個'網址'表,每個'網址'可能有多個'轉換'附加到他們。我想累積所有轉化的數值($),並計算與每個網址相關的轉化數量。顯示需要累積的多個值的左連接

此刻,我正在使用左外部聯接將url表加入轉換表,但如果附加了多個轉換,這隻會重複URL記錄。我想知道我能做些什麼來解決這個問題,無論是在數據庫端或邏輯側(我使用PHP /笨。)

如果有幫助,這裏是笨的Active Record查詢:

$this->db->select('url.id, url.url, url.clicks,url.affiliate_url,conversion.commission'); 
    $this->db->from('url'); 
    $this->db->join('conversion', 'url.id = conversion.url_id','left outer'); 
    $this->db->where('url.user_id = '.$this->user_id); 
    $this->db->order_by('url.id','DESC'); 
    $data['urls'] = $this->db->get()->result(); 

在此先感謝!

湯姆

解決方案:

$this->db->select('url.id, url.url, url.clicks,url.affiliate_url,count(conversion.id) AS conversions,sum(conversion.commission) AS earnings'); 
$this->db->from('url'); 
$this->db->join('conversion', 'url.id = conversion.url_id','left outer'); 
$this->db->where('url.user_id = '.$this->user_id); 
$this->db->group_by('url.id'); 
$this->db->order_by('url.id','DESC'); 
$data['urls'] = $this->db->get()->result(); 
enter code here 

回答

2

你需要按的網址:

SELECT url.id, url.url, sum(url.clicks), count(url.clicks,url.affiliate_url), sum(conversion.commission) 
FROM url 
LEFT JOIN conversion ON url.id = conversion.url_id 
WHERE url.user_id = ? 
GROUP BY url.id, url.url 
ORDER BY url.id DESC 

對不起它不是笨,但我敢肯定,你可以轉換。

+0

絕對的英雄!我將在上面發佈我的代碼。 – tommizzle 2010-11-18 12:31:47

+1

您還需要爲GROUP BY列編制索引。 – 2010-11-19 16:03:03

+0

好點布魯斯,這會很好地加快你的查詢。請記住,如果表格非常龐大(數百萬行),它可能會降低更新速度並插入一點點。 – 2010-11-19 16:09:39

2

這應該是訣竅。

$this->db->select('url.id, url.url, url.clicks,url.affiliate_url,conversion.commission'); 
$this->db->select_sum('conversion.commission'); 
$this->db->from('url'); 
$this->db->join('conversion', 'url.id = conversion.url_id','left outer'); 
$this->db->where('url.user_id = '.$this->user_id); 
$this->db->group_by('url.id'); 
$this->db->order_by('url.id','DESC'); 

您需要根據網址的ID對結果進行分組,然後總結轉換。祝你好運;)

p.s.我沒有用過ci,但是這些是你需要的方法(第2行& 6)

+0

感謝您的回答!我使用了類似的查詢(編輯到上面的帖子中)。 – tommizzle 2010-11-18 12:33:44