MySQL множественная ошибка LEFT OUTER JOIN - PullRequest
4 голосов
/ 30 апреля 2011

Я надеюсь, что кто-то может помочь мне с моей проблемой MySQL.У меня есть ошибка, когда, если есть одно левое внешнее объединение в таблице вкладов, результат суммы составляет $ 100 (что правильно).Если я включу второе левое внешнее соединение другой таблицы (ikes).И у меня 2 ика, он удваивает сумму (200 долларов), если у меня 3 ика, он утраивается (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 Ответ

2 голосов
/ 30 апреля 2011

Хотя большинство скажет вам использовать 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
...