By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE orders (
`email` VARCHAR(11),
`id` INTEGER,
`year` INTEGER
);
INSERT INTO orders
(`email`, `id`, `year`)
VALUES
('foo@bar.com', '1001', '2019'),
('foo@bar.com', '1002', '2019'),
('foo@bar.com', '1003', '2019'),
('foo@bar.com', '1004', '2020'),
('foo@bar.com', '1005', '2020'),
('foo@bar.com', '1006', '2020'),
('foo@bar.com', '1007', '2021'),
('foo@bar.com', '1008', '2021'),
('foo@bar.com', '1009', '2021'),
('bar@foo.com', '1111', '2019'),
('bar@foo.com', '1112', '2019'),
('bar@foo.com', '1113', '2019'),
('bar@foo.com', '1114', '2020'),
('bar@foo.com', '1115', '2020'),
('bar@foo.com', '1116', '2021'),
('bar@foo.com', '1117', '2021'),
('bar@foo.com', '1118', '2021');
WITH CTE AS
( SELECT `email`, `year`
FROM orders
WHERE `year` IN(2019,2020,2021)
GROUP BY `email`, `year`
HAVINg COUNT(*) = 3)
SELECT `email` FROM CTE GROUP BY `email` HAVING Count(*) = 3
foo@bar.com |
SELECT `email` FROM
( SELECT `email`, `year`
FROM orders
WHERE `year` IN(2019,2020,2021)
GROUP BY `email`, `year`
HAVINg COUNT(*) = 3) CTE GROUP BY `email` HAVING Count(*) = 3
foo@bar.com |