2017-02-22 214 views
0

嗨,我需要選擇一些用戶郵件,我不明白如何。MySQL應該使用WHERE NOT EXISTS嗎?

我有3張桌子。

用戶支付代碼

當一個用戶支付(內部消除代碼),一條線是添加到payement表,我們有一些像

<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嗎?怎麼樣 ?

+0

您能否提供其他表的模式? – RRajani

+1

SQL應該可以正常工作。它不應該返回42的任何CodeId。 –

+0

@LuudvanKeulen它也將返回客戶以外的42 CodeId.Means CodeId = 0,1,2 ..,40,41,43,44 .. –

回答

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 
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 
+0

爲什麼會投票??? – denny

+0

我贊成賠償downvote。如果用戶低估了它會給出一個堅實的解釋,我會刪除我的upvote。 –

+0

@LuudvanKeulen感謝您的支持 – denny

0

在我看來,您希望排除提及代碼42的任何用戶,即使同一用戶有其他付款。

嘗試是這樣的:

SELECT mail, SUM(p.amount) payements 
    FROM User 
    LEFT JOIN payement px ON User.id = px.UserId AND px.CodeId = 42 
    JOIN payement p ON User.id = p.UserId AND p.CodeId <> 42 
WHERE px.UserID IS NULL 
    AND p.amount > 0 
GROUP BY mail 

注意使用LEFT JOIN的/ IS NULL模式排除某些行。這是排除與LEFT JOIN的ON標準相匹配的東西的常用技巧。

還要注意在兩個單獨的連接中使用payement表。