2010-11-18 3 views
0

J'ai un tableau des 'URL' et chacune des 'URL' peut être associée à plusieurs 'conversions'. Je veux accumuler la valeur numérique de toutes les conversions ($) et comptabiliser également le nombre de conversions liées à chaque URL.Affichage de la jointure à gauche avec plusieurs valeurs à accumuler

Pour le moment j'utilise une jointure externe gauche pour joindre la table d'URL à la table de conversion, mais cela ne fait que répéter l'enregistrement d'URL s'il y a plusieurs conversions jointes. Je veux savoir ce que je peux faire pour résoudre ce problème, que ce soit du côté de la base de données ou sur le côté logique (j'utilise PHP/CodeIgniter.)

Si elle aide, voici le CodeIgniter actif Enregistrement Requête:

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

Merci d'avance!

Tom

Solution:

$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 

Répondre

2

Vous devez groupe par l'URL:

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 

Désolé, il est pas CodeIgniter, mais je suis sûr que votre capable de convertir .

+0

Héros absolu! Je posterai mon code ci-dessus. – tommizzle

+1

Vous devez également indexer les colonnes GROUP BY. –

+0

Bon point Bruce, cela va accélérer votre requête bien. Gardez à l'esprit que cela peut ralentir vos mises à jour et les insérer un peu si la table est massive (des millions de lignes). –

2

cela devrait faire l'affaire.

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

Vous devez grouper vos résultats par ID d'URL et résumer les conversions. bonne chance;)

p.s. Je n'ai pas travaillé avec ci, mais ce sont les méthodes pour ce dont vous avez besoin (lignes 2 & 6)

+0

Merci pour la réponse! J'ai utilisé une requête similaire (éditée dans le post ci-dessus.) – tommizzle

Questions connexes