2015-04-01 62 views
0

這些是我的表格。第一個是appusers表。我想在mysql的3個表中使用left和inner join?

CREATE TABLE IF NOT EXISTS `appusers` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`email` varchar(50) NOT NULL, 
`is_active` tinyint(2) NOT NULL DEFAULT '0', 
`zip` varchar(20) NOT NULL, 
`city` text NOT NULL, 
`country` text NOT NULL, 
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=23 ; 

第二個表是stickeruses表。

CREATE TABLE IF NOT EXISTS `stickeruses` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`user_id` int(11) NOT NULL, 
`sticker_id` int(11) NOT NULL, 
`count` int(11) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=24 ; 

三表設備

CREATE TABLE IF NOT EXISTS `devices` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`user_id` int(11) NOT NULL, 
`regid` varchar(300) NOT NULL, 
`imei` varchar(50) NOT NULL, 
`device_type` tinyint(2) NOT NULL, 
`notification` tinyint(2) NOT NULL DEFAULT '1', 
`is_active` tinyint(2) NOT NULL DEFAULT '0', 
`activationcode` int(6) NOT NULL, 
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ; 

我想找到的總和(stickerusescount)和COUNT(devicesid)的所有appusers。

這是我的查詢。

SELECT `Appuser`.`id`, `Appuser`.`email`, `Appuser`.`country`, `Appuser`.`created`, 
    `Appuser`.`is_active`, SUM(`Stickeruse`.`count`) AS total, COUNT(`Device`.`id`) 
    AS tdevice 
FROM `stickerapp`.`appusers` AS `Appuser` 
LEFT JOIN `stickerapp`.`stickeruses` AS `Stickeruse` 
    ON (`Stickeruse`.`user_id`=`Appuser`.`id`) 
INNER JOIN `stickerapp`.`devices` AS `Device` 
    ON (`Device`.`user_id`=`Appuser`.`id`) 
WHERE `Appuser`.`is_active` = 1 
GROUP BY `Appuser`.`id` 
LIMIT 10 

當我單獨應用每個連接的結果是正確的,但我想要結合這兩個連接。當我這樣做時,結果是錯誤的。請幫忙。

回答

1

當混合JOINLEFT JOIN這是一個好主意,使用括號來說明你的意圖是什麼。

我不知道你需要什麼,但這些語法可能會出現不同的結果:

FROM a LEFT JOIN (b JOIN c ON b..c..) bc ON a..bc.. 
FROM (a LEFT JOIN b ON a..b..) ab JOIN c ON ab..c.. 

此外,您還可以重新安排他們做FROM a JOIN c LEFT JOIN b(加括號)或任何其他幾個安排。當然,一些對重新排列是等價的。

另外,要小心;當JOIN ing時聚合(例如SUM())得到虛增值。可以這樣想:首先JOINs從表格中獲得所有適當的行組合,然後SUM將它們相加。考慮到這一點,看看這是否更好:

SELECT a.`id`, a.`email`, a.`country`, a.`created`, a.`is_active`, 
     (SELECT SUM(`count`) 
      FROM stickerapp.stickeruses 
      WHERE user_id = a.id 
    ) AS total, 
     (SELECT COUNT(*) 
      FROM stickerapp.devices 
      WHERE user_id = a.id 
    ) AS tdevice 
    FROM stickerapp.`appusers` AS a 
    WHERE a.`is_active` = 1 
    GROUP BY a.`id` 
    LIMIT 10 
+0

感謝您的回答。 @瑞克詹姆斯。 – CodeZilla 2015-04-29 07:33:53