我的表结构有点类似于此:SQL多表连接,GROUP BY和HAVING
CREATE TABLE `user`
(`id` int, `name` varchar(7));
CREATE TABLE `email`
(`id` int, `email_address` varchar(50), `verified_flag` tinyint(1),`user_id` int);
CREATE TABLE `social`
(`id` int,`user_id` int);
INSERT INTO `user`
(`id`, `name`)
VALUES
(1,'alex'),
(2,'jon'),
(3,'arya'),
(4,'sansa'),
(5,'hodor')
;
INSERT INTO `email`
(`id`,`email_address`,`verified_flag`,`user_id`)
VALUES
(1,'[email protected]','1',1),
(2,'[email protected]','0',1),
(3,'[email protected]','0',3),
(4,'[email protected]','1',4),
(5,'[email protected]','0',3),
(6,'[email protected]','0',5),
(7,'[email protected]','0',1)
;
INSERT INTO `social`
(`id`,`user_id`)
VALUES
(1,4),
(2,4),
(3,5),
(4,4),
(5,4)
;
我想要得到的是所有电子邮件:
- 未核实
- 属于一个用户谁没有,即0,验证电子邮件
- 属于一个用户谁没有,即0,社会记录
随着下面的查询,我能申请的第1和第3条件,但不是第二届一个:
SELECT *
FROM `email`
INNER JOIN `user` ON `user`.`id` = `email`.`user_id`
LEFT JOIN `social` ON `user`.`id` = `social`.`user_id`
WHERE `email`.`verified_flag` = 0
GROUP BY `email`.`user_id`,`email`.`email_address`
HAVING COUNT(`social`.`id`) = 0
我怎样才能达到的效果? 这里的sqlfiddle以及
谢谢你,先生的数量。 :)你认为还有其他方法可以达到同样的效果吗? – mrudult
@MrudulT检查我所做的修改。 –
@MrudulT当你的表变大时,“拥有”和“子查询”变成了一个非常糟糕的主意。看到我的答案替代 – yomexzo