2011-07-01 4 views
2

essentiellement j'ai cette structure:mysql INNER JOIN provoquant la multiplication

  • affaire a et appartient à de nombreux canaux
  • affaire a beaucoup DealSales
  • affaire appartient à Channel

Quand je veux pour trouver le montant vendu par un accord, j'utilise cette requête:

SELECT targets.id,SUM(deal_sales.amount_sold) AS amount_sold 
FROM deal_sales 
INNER JOIN deals ON deals.id = deal_sales.deal_id 
INNER JOIN targets ON deals.target_id = targets.id 
WHERE targets.approved = 1 AND targets.active = 1 
GROUP BY targets.id 

son travail très bien, le problème est quand j'ai besoin de filtrer par canal, trouver le montant vendu par un accord dans un canal:

SELECT targets.id,SUM(deal_sales.amount_sold) AS amount_sold 
FROM deal_sales 
INNER JOIN deals ON deals.id = deal_sales.deal_id 
INNER JOIN targets ON deals.target_id = targets.id 
**INNER JOIN channels_deals ON channels_deals.deal_id = deals.id** 
WHERE targets.approved = 1 AND targets.active = 1 
GROUP BY targets.id 

Quand j'ajouter la jointure à la table des canaux, la amount_sold est multiplié par chaque canal avec lequel une relation est en relation. Comment puis-je éviter ça?

+0

sont des règles numéro 1 et 3 correcte ?, Deal 'a et appartient à beaucoup' ou 'appartient à' Channel (s)? ?? – fdaines

+0

et qu'en est-il des objectifs ?, un marché appartient à une cible? – fdaines

Répondre

0

Utilisation IN ou Exists

par exemple

SELECT targets.id,SUM(deal_sales.amount_sold) AS amount_sold 
FROM deal_sales 
INNER JOIN deals ON deals.id = deal_sales.deal_id 
INNER JOIN targets ON deals.target_id = targets.id 

WHERE targets.approved = 1 AND targets.active = 1 
    and 
    deals.id IN (SELECT deal_id from channels_deals where something = 1) 
GROUP BY targets.id 
+0

merci, ça a très bien fonctionné: D –

0
Try this: 

SELECT channels_deals.deal_id,SUM(deal_sales.amount_sold) AS amount_sold 
FROM deal_sales 
INNER JOIN deals ON deals.id = deal_sales.deal_id 
INNER JOIN targets ON deals.target_id = targets.id 
INNER JOIN channels_deals ON channels_deals.deal_id = deals.id 
WHERE targets.approved = 1 AND targets.active = 1 
GROUP BY channels_deals.deal_id