mysql内连接导致乘法

时间:2011-07-01 14:59:50

标签: mysql ruby-on-rails inner-join

基本上我有这个结构:

  • 交易已经属于许多频道
  • 交易有很多DealSales
  • 交易属于Channel

当我想查找交易所售出的金额时,我会使用此查询:

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

它的工作得很好,问题是当我需要按渠道过滤,找到通道中交易所售出的金额:

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

当我将联接添加到渠道表时, amount_sold 会与交易所关联的每个渠道相乘。我怎么能避免这个?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用IN或存在

例如

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