【问题标题】:i want to use left and inner join in 3 tables in mysql?我想在 mysql 的 3 个表中使用左连接和内连接?
【发布时间】:2015-04-01 12:13:39
【问题描述】:

这些是我的桌子。第一个是 appusers 表。

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 ;

第二个表是贴纸表。

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 ;

我想找到所有应用用户的 Sum(stickeruses.count) 和 COUNT(devices.id)。

这是我的问题。

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

当我分别应用每个连接时,结果是正确的,但我想合并两个连接。当我这样做时,结果是错误的。请帮忙。

【问题讨论】:

    标签: php mysql database cakephp join


    【解决方案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(加上括号)或其他几种排列方式重新排列它们。当然,某些对的重新排列是等价的。

    另外,请注意;当JOINing 时,聚合(例如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 
    

    【讨论】:

    • 感谢您的回答。 @里克·詹姆斯。
    猜你喜欢
    • 2016-08-31
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多