MySQL应该使用WHERE NOT EXISTS吗?

时间:2017-02-22 12:31:39

标签: mysql select

嗨,我需要选择一些用户邮件,我不明白如何。

我有3张桌子。

用户付款代码

当一个用户付费(无代码)时,会在付款表中添加一行,我们会有类似

的内容
<strong>Payement Table</strong>
+----+--------+--------+--------+
| Id | UserId | Amount | CodeId |
+----+--------+--------+--------+
| 01 |   2545 |     20 |      0 |
+----+--------+--------+--------+

如果同一位用户现在使用代码付款

<strong>Payement Table</strong>
+----+--------+--------+--------+
| Id | UserId | Amount | CodeId |
+----+--------+--------+--------+
| 01 | 2545   | 20     | 0      |
| 02 | 2545   | 5      | 42     |
+----+--------+--------+--------+

我想要的是选择已经付款的所有客户,而不是已经使用该代码的客户(在这种情况下CodeId = 42)。

所以我试过这个

SELECT mail
  FROM User "
 INNER JOIN payement ON User.id = payement.UserId 
 WHERE payement.CodeId<>42
   AND payement.amount>0
 GROUP BY mail

我的问题是:

我仍然有客户使用此请求的代码。我想我知道为什么。但我应该使用WHERE NOT EXISTS吗?怎么样 ?

2 个答案:

答案 0 :(得分:1)

如果用户在未使用代码的情况下付款,您将获得codeid = 0。如果是这样,请尝试:

SELECT mail
FROM User
INNER JOIN payement ON User.id = payement.UserId
WHERE payement.CodeId = 0
    AND payement.amount > 0
GROUP BY mail

答案 1 :(得分:0)

您应该使用innot in子句来实现多条件

SELECT mail FROM User 
INNER JOIN payement 
ON User.id = payement.UserId 
WHERE payement.CodeId not in (0,42) and payement.amount > 0 GROUP BY mail

如果您想要哪些客户使用代码= 0,那么

SELECT mail FROM User 
INNER JOIN payement 
ON User.id = payement.UserId 
WHERE payement.CodeId in (0) and payement.amount > 0 GROUP BY mail

如果您想要哪些客户不使用代码!= 0则

SELECT mail FROM User 
INNER JOIN payement 
ON User.id = payement.UserId 
WHERE payement.CodeId not in (0) and payement.amount > 0 GROUP BY mail