2017-01-28 7 views
2

Ich habe eine Frage, die mich verrückt gemacht hat. Es scheint, als ob die Antwort möglich (oder sogar offensichtlich) sein könnte, aber ich bin bis zu diesem Punkt ratlos.SQL-Filterung jedes Abfrageergebnis anders

Hier ist der Zusammenhang. Ich versuche herauszufinden, welche meiner Benutzer sich innerhalb der letzten 90 Tage nach Ablauf ihrer Produktlizenzen angemeldet haben (jetzt, da sie keine Kunden mehr sind). Das Problem ist, dass der Filter relativ zum Ablauf der Lizenzen ist, was für jeden Kunden anders ist. Ich versuchte zunächst eine Abfrage wie folgt zu schreiben:

SELECT customer_id, email 
FROM customers 
WHERE last_login > ((SELECT license_end FROM customers)-7776000) 

Dies ist ein Unix-Zeitstempel sowohl für last_login und license_end, so dass die 7.776.000 ist die Sekunden Umwandlung für 90 Tage. Wie Sie sicherlich bereits festgestellt haben, wird diese Unterabfrage mehr als eine Zeile zurückgeben und fehlschlagen. Hoppla.

In diesem Fall gibt es eine Möglichkeit, alle IDs und E-Mails zurückzugeben, die innerhalb der letzten 30 Tage nach dem Ende ihrer Lizenzen einen last_login-Zeitstempel hatten, da jedes Lizenzenddatum für jeden Kunden unterschiedlich ist?

Ich weiß, ich kann es nur in einer Tabelle tun, aber dieses Puzzle macht mich verrückt. Vielen Dank im Voraus für Ihre Expertise !!

Antwort

0

Sie benötigen keine Unterabfrage benötigen. Sie vergleichen einfach Spalten aus derselben Zeile der Tabelle.

SELECT customer_id, email 
FROM customers 
WHERE last_login > license_end - 7776000 
+0

Ich glaube, meine Verwirrung kam von der Tatsache, die ich versuchte zu tun a '((SELECT unix_timestamp (license_end) FROM Kunden) -7776000)', aber es stellt sich heraus, dass die 'SELECT' und' FROM' vollständig unnötig waren. (Diese Spalte ist eigentlich ein Zeitstempel, nicht in Unix.) Das hat definitiv funktioniert. Vielen Dank!! – user7484388

+0

Wenn beide Spalten Zeitstempel sind, verwenden Sie 'DATE_SUB()', um ein Intervall zu subtrahieren – Barmar

0

wenn diese wirklich in der gleichen Kunden Tabelle sind (die nicht gut normalisiert scheint - aber ok)

dann brauchen Sie nur diese

SELECT customer_id, email 
FROM customers 
WHERE last_login > license_end-7776000 
+0

Ja diese sind nicht wirklich in der gleichen Tabelle, ich wollte nur für den Geist der Frage vereinfachen. Danke für die Hilfe! – user7484388

+0

@ user7484388 Wenn sie nicht in der gleichen Tabelle sind, müssen Sie den Tabellen beitreten, dann können Sie 'table1.last_login> table2.license_end - 7776000' – Barmar

Verwandte Themen