MySQL多个LEFT OUTER JOIN错误

时间:2011-04-30 05:49:47

标签: mysql sql join aggregate-functions

我希望有人可以帮我解决我的MySQL问题。我有一个错误,如果在贡献表上有一个左外连接,金额的结果是$ 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;

1 个答案:

答案 0 :(得分:2)

虽然大多数人会告诉您使用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