2016-04-28 6 views
0

Ich habe eine Schmelze und meine Erfahrung mit SQL ist irgendwie begrenzt, für diese Art von Zwecken. Sagen, dass ich die beiden folgenden Tabellen haben:mySQL SELECT zwischen Daten und mit Bedingungen

customer_list:

id | email 
----------------------------------- 
1  | [email protected] 
2  | [email protected] 
3  | [email protected] 

payment_log

customer_id | payment_date | payment_type_id 
------------------------------------------------------------- 
1    | 2016-01-01  | 3 
1    | 2016-01-05  | 3 
1    | 2016-01-02  | 2 
1    | 2016-04-01  | 1 
1    | 2016-04-12  | 2 
2    | 2016-01-13  | 1 
2    | 2016-01-19  | 1 
2    | 2016-01-07  | 1 
2    | 2016-01-04  | 1 
3    | 2016-04-15  | 2 

Die Kunden Ich möchte in diesem Beispiel wählen, muss folgende Kriterien gerecht:

  • Muss eine Zahlung vor 2016-03-22 mit einer beliebigen Zahlungsart erfolgen, AUSSER payment_ty pe_id = 3.

  • haben muss mindestens eine Zahlung nach 2016.03.22, mit payment_type_id = 3.

Der Kunde ich als Ergebnis der Abfrage benötigen gemacht CUSTOMER_ID = 1.

+0

Sie benötigen entweder eine Bedingung richtig zu erfüllen? –

+0

Versuchen Sie diese Abfrage "SELECT customer_id VON payment_log WHERE (payment_date <'2016-03-22' UND payment_type_id! = 3) ODER (payment_date> 2016-03-22 AND payment_type_id = 3)"; –

+0

Braucht beide Kriterien :) – EibergDK

Antwort

0
SELECT * FROM customer 
WHERE id IN (
    SELECT DISTINCT L1.customer_id AS id 
    FROM payment_log L1 
    LEFT JOIN payment_log L2 ON L1.customer_id = L2.customer_id 
    WHERE 
     L1.payment_date < '2016-03-22' 
    AND L2.payment_date > '2016-03-22' AND L2.payment_type_id = 3 
) 
0

Versuchen Sie dies.

SELECT customer_id 
FROM payment_log 
WHERE payment_date =< '2016-03-22' AND payment_type_id != '3'); 
+0

Dies würde nur eine Bedingung erfüllen – Matt

0

Versuchen Sie so etwas wie:

SELECT 
    DISTINCT customer_id 
FROM 
    payment_log 
WHERE 
    (payment_date < '2016-03-22' AND payment_type_id != 3) 
    AND 
    customer_id IN (SELECT DISTINCT customer_id FROM payment_log WHERE payment_date > 2016-03-22 AND payment_type_id = 3); 

Sie haben möglicherweise die SQL-Syntax ein wenig massieren, aber es sollte Sie geben, was Sie brauchen.

1

Ich denke, man eine innere auf dem gleichen Tisch sitzen verwenden sollten

SELECT distinct a.customer_id FROM payment_log as a 
INNER JOIN payment_log as b 
     on (a.customer_id = b.customer_id and a.payment_date = b.payment_date) 
WHERE (a.payment_date < '2016-03-22' AND a.payment_type_id!=3) 
AND (b.payment_date>2016-03-22 AND b.payment_type_id=3)";