MySQL - 两者之一,但不是两者都没有重复

时间:2015-02-01 19:18:17

标签: mysql sql

表格日常邮件

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

1 个答案:

答案 0 :(得分:1)

这是set-within-sets问题的变体。回答这个问题的好方法是使用group byhaving

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子句)。因此,这只是将其他值拉出行。