表格日常邮件
id | email | direction | operation
---+------------------+-----------+-----------------------
1 | adrian@gmail.com | Incoming | Received successfully
2 | adrian@gmail.com | Incoming | Unsuccessful
3 | beth@gmail.com | Outgoing | Sent successfully
4 | carl@gmail.com | Incoming | Received successfully
5 | carl@gmail.com | Incoming | Received successfully
6 | dave@gmail.com | Incoming | Received successfully
7 | dave@gmail.com | Incoming | Received successfully
8 | dave@gmail.com | Incoming | Unsuccessful
9 | ethan@gmail.com | Outgoing | Sent successfully
10 | ethan@gmail.com | Outgoing | Sent successfully
11 | george@gmail.com | Outgoing | Sent successfully
12 | george@gmail.com | Outgoing | Sent successfully
13 | george@gmail.com | Outgoing | Unsuccessful
14 | hanna@gmail.com | Incoming | Received successfully
15 | hanna@gmail.com | Outgoing | Sent successfully
16 | jane@gmail.com | Incoming | Received successfully
17 | jane@gmail.com | Outgoing | Sent successfully
18 | jane@gmail.com | Incoming | Unsuccessful
19 | kyle@gmail.com | Incoming | Received successfully
20 | kyle@gmail.com | Outgoing | Sent successfully
21 | kyle@gmail.com | Outgoing | Unsuccessful
22 | lucy@gmail.com | Incoming | Received successfully
23 | lucy@gmail.com | Outgoing | Sent successfully
24 | lucy@gmail.com | Outgoing | Unsuccessful
25 | lucy@gmail.com | Incoming | Unsuccessful
26 | matt@gmail.com | Incoming | Unsuccessful
27 | nate@gmail.com | Outgoing | Unsuccessful
28 | pat@gmail.com | Incoming | Received successfully
29 | pat@gmail.com | Incoming | Received successfully
30 | pat@gmail.com | Outgoing | Unsuccessful
31 | ryan@gmail.com | Outgoing | Sent successfully
32 | ryan@gmail.com | Outgoing | Sent successfully
33 | ryan@gmail.com | Incoming | Unsuccessfully
查询 -
SELECT *
from dailyemails
WHERE direction in ('Incoming', 'Outgoing')
AND operation = 'Sent successfully'
OR operation = 'Received successfully'
我尝试编写SQL查询并抓取用户电子邮件,其中有1封传入的电子邮件或1封已成功发送的电子邮件'或者'成功收到'。
为了进一步说明,如果用户有2个或更多成功的传入电子邮件或者有2个或更多成功的传出电子邮件,则必须排除这些电子邮件。此外,如果用户有1个成功的传入电子邮件和1个成功的传出电子邮件,则必须将其排除在外。
非常感谢帮助。感谢。
您可以在此处测试架构和SQL: http://sqlfiddle.com/#!2/b0e43d
所以我应该得到的最终结果是:
id | email | direction | operation
---+------------------+-----------+-----------------------
1 | adrian@gmail.com | Incoming | Received successfully
3 | beth@gmail.com | Outgoing | Sent successfully
答案 0 :(得分:1)
这是set-within-sets问题的变体。回答这个问题的好方法是使用group by
和having
。
select max(de.id), de.email, max(de.direction), max(de.operation)
from dailyemails de
where de.operation in ('Sent successfully', 'Received successfully')
group by de.email
having count(*) = 1
一些解释。 where
子句将操作限制为只有两个感兴趣的操作。 having
子句指定只有一个匹配。
max()
中的select
并没有真正做任何事情。每个组中只有一行匹配(因为where
子句)。因此,这只是将其他值拉出行。