我的表結構有點類似於此: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