MySQL多个LEFT OUTER JOIN的错误

4
我希望有人能帮我解决MySQL问题。当在contribution表上进行一个左外连接时,结果为$100(正确)。如果我加入另一张表(ikes)的第二个左外连接,并且我有2个ikes,则金额翻倍($200),如果我有3个ikes,则金额变为三倍($300)。我真的无法理解这个问题。ikes与捐赠金额有什么关系?我已经将查询分开,它们可以单独运行。但是一起使用会导致问题。

有人能看出问题吗?我在下面包括了查询和表格。

         SELECT COUNT(i.type) AS xlike, 
                SUM(c.amount) AS amount, 
                w.* 
           FROM wish w 
LEFT OUTER JOIN contributions c ON w.ID=c.receiveid
LEFT OUTER JOIN ikes i ON w.ID=i.wishid 
          WHERE w.ID = 236

表格:

CREATE TABLE IF NOT EXISTS `contributions` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `amount` decimal(19,2) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

CREATE TABLE IF NOT EXISTS `ikes` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `type` enum('likes','dislikes') NOT NULL,
  `wishid` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

“wish”表的结构是什么? - JWL
1个回答

3

虽然大多数人会告诉你使用JOIN,但你必须意识到,如果一个父记录与多个子记录关联,则连接将复制父记录。 这就是导致聚合函数值膨胀的原因。

我将查询重写为:

   SELECT w.*,
          COALESCE(x.amount, 0) AS amount,
          COALESCE(y.type, 0) AS type
     FROM WISH w 
LEFT JOIN (SELECT c.receiveid,
                  SUM(c.amount) AS amount
             FROM CONTRIBUTIONS c
         GROUP BY c.receiveid) x ON x.receiveid = w.ID
LEFT JOIN (SELECT i.wishid,
                  COUNT(i.type) AS type
             FROM IKES i
         GROUP BY i.wishid) y ON y.wishid = w.ID
    WHERE w.ID = 236

谢谢OMG!这个方法非常有效。但我仍然想知道为什么上面的代码会失败?我不想以后再遇到同样的问题。 - edgar
@edgar:我已经解释了重复的来源 - 你的查询还有其他问题吗? - OMG Ponies
@edgar:只需去掉COUNT()和SUM(),并查看在三种情况下没有聚合的结果表--那么就应该很清楚了。 - Hogan
这个查询是有效的,但我认为子查询没有进行任何过滤,所以如果您有大量的贡献和喜欢的表格,它会很慢。 - the1plummie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接