Ich habe eine Tabelle mit dem folgenden Typ und Informationen.
product_id | user_id | product | date_opened
1 | 10 | shoes | 2016-04-01
2 | 26 | shoes | 2016-04-01
3 | 10 | watch | 2016-04-01
4 | 23 | shoes | 2016-04-01
5 | 10 | shoes | 2016-01-01
6 | 13 | watch | 2016-01-01
7 | 14 | shoes | 2015-11-02
8 | 10 | slippers| 2015-11-02
9 | 10 | shoes | 2015-11-02
10 | 15 | watch | 2015-11-02
11 | 19 | watch | 2015-09-03
12 | 19 | watch | 2015-03-02
13 | 19 | shoes | 2015-01-03
Benutzer können Produkte kaufen, wenn es geöffnet ist. date_open
ist der Datumszyklus. Benutzer können so viele Produkte kaufen, wie er möchte. Beispiel ist user_id
10 , Benutzer 10 hat 2 Produkte im Zyklus 2016-04-01. Ein Produkt am 01.01.2016, zwei am 02.11.2015.
Jetzt möchte ich alle (unterschiedlichen) Benutzer-IDs abrufen , die an allen vorherigen 3 Zyklusdaten (01.04.2016, 01.01.2016 und 02.11.2015) aktiv sind / Produkte haben .
Beachten Sie, dass ein Benutzer viele Produkte in einem Zyklus haben kann.
Zusätzlich: Aktiv - sollte nacheinander Produkte in 3 Sätzen dates
und ohne Überspringen haben. Daher sollte es allen Benutzern mit Produkten das Datum 2016-04-01 und 2016-01-01 und 2015-11-02 anzeigen. Kein Benutzer mit Produkten nur in 1 oder 2 Daten.
Ein weiteres Problem hier: Beispiel: Ich habe Benutzer mit unterschiedlichen Daten (2000-04-05, 2001-09-03, 2006-09-01, 2015-11-02 usw.). Ich möchte nur hierher kommen, sind alle Benutzer mit Datumsangaben ('2016-04-01', '2016-01-01', '2015-11-02').
Mit dieser SQL erhalten Sie die verschiedenen Benutzer, die Produkte an allen vorherigen drei Zyklusdaten haben:
SELECT USER_ID
FROM YOUR_TABLE OUTER_TABLE
WHERE 3 = (SELECT COUNT(DISTINCT DATE_OPENED)
FROM YOUR_TABLE INNER_TABLE
WHERE DATE_OPENED IN ('2016-04-01', '2016-01-01', '2015-11-02')
AND OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID);
Die Anweisung kann schneller (ungetestet) sein, wenn sie wie folgt umgeschrieben wird:
SELECT DISTINCT USER_ID
FROM YOUR_TABLE OUTER_TABLE
WHERE EXISTS (SELECT 1
FROM YOUR_TABLE INNER_TABLE
WHERE OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID
WHERE DATE_OPENED = '2016-04-01')
AND EXISTS (SELECT 1
FROM YOUR_TABLE INNER_TABLE
WHERE OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID
WHERE DATE_OPENED = '2016-01-01')
AND EXISTS (SELECT 1
FROM YOUR_TABLE INNER_TABLE
WHERE OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID
WHERE DATE_OPENED = '2015-11-02');
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen