2017-02-22 5 views
0

Привет, мне нужно выбрать некоторые почтовые адреса пользователей, и я не понимаю, как это сделать.MySQL должен ли я использовать ГДЕ НЕ СУЩЕСТВУЕТ?

У меня есть 3 стола.

Пользователи, оплаты и код

Когда один пользователь заплатил (Whithout код), линия, это добавить в Payement таблицы и у нас есть что-то вроде

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

If тот же пользователь заплатил с кодом сейчас

<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 

Моей проблема:

Я до сих пор есть клиент, который использует код с этой просьбой. Кажется, я знаю, почему. Но следует ли использовать ГДЕ НЕ СУЩЕСТВУЕТ? Как ?

+0

Можете ли вы предоставить схему других таблиц. – RRajani

+1

sql должен работать нормально. Он не должен возвращать какой-либо CodeId с 42. –

+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

вы должны использовать in или not 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

Я воспользовался, чтобы компенсировать нижний предел. Если пользователь, который проигнорировал его, даст подробное объяснение, я удалю свой верхний знак. –

+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 шаблон, чтобы исключить определенные строки. Это обычно используемый трюк, чтобы исключить материал, соответствующий критериям ON (ВЛЕВО) JOIN.

Также обратите внимание на использование таблицы выплат в двух отдельных соединениях.

Смежные вопросы