我希望有人能帮我解决mysql的问题。我有一个bug,如果贡献表上有一个左外连接,则amount的结果是$100(这是正确的)。如果我包含另一个表(ikes)的第二个左外部连接。我有两个ike,是金额的两倍(200美元),如果我有三个ike,是金额的三倍(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;
最佳答案
虽然大多数都会告诉您使用联接,但您必须注意,如果有多个子记录与联接关联,则联接将复制父记录。这就是从聚合函数中膨胀值的原因。
我把你的问题重新写成:
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