2016-07-21 11 views
0

Ich habe eine MySQL-Tabelle mitMySQL Select User-IDs basierend auf Kontinuierlich Reihen Value & Zustand

  • row_id (primär)
  • User_id
  • user_ip
  • DATE_START (Unix-Zeitstempel)
  • date_end (Unix Timestamp)

Ich möchte nur die Benutzer-IDs von Diese Tabelle (distinct) IFmindestens 2 kontinuierlich Reihen sind, wo

die user_ip in [row X] mit der user_ip in [Zeile X + 1] unterscheidet

UND

ABS (date_end in [row X] - DATE_START in [Zeile X + 1]) < = 20

Die Zeilen sollten von row_id ASC sortiert werden, damit wir die Zeile X, X + 1 usw. kontinuierlich erhalten können.

Ich habe dies mit PHP leicht gemacht, aber es ist sehr, sehr langsam, also denke ich, dass es mit nur SQL gemacht werden kann.

Beispiel

row_id | user_id | user_ip | date_start | date_end 

1  , 1  , 127.0.0.1 , 1469100096 , 1469100099 
2  , 2  , 5.5.5.5 , 1469100054 , 1469100055 
3  , 3  , 4.4.4.4 , 1469100032 , 1469100036 
4  , 1  , 6.6.6.6 , 1469100117 , 1469100099 
5  , 4  , 127.0.0.1 , 1469100001 , 1469100005 
6  , 2  , 127.0.0.1 , 1469100555 , 1469100565 

Daraus sollten wir nur die Benutzer-ID 1, da die Benutzer-ID 1 HAD andere IP in 2 kontinuierlich Reihen + die date_end der ersten Reihe (1469100099) erhalten - das Datum Beginn der nächsten Zeile 1 (469100117) = 18 Das ist = 20.

Wir sollten die Benutzer-ID 2 NICHT zurückgeben, da sie zwar die erste Bedingung validiert, aber die 2. Bedingung mit dem Datum_End und nicht validiert Start Datum.

+0

Blick auf: stackoverflow.com/questions/9824948/... Und versuchen Sie so etwas wie dieses: SELECT parent.id FROM Tabellenname AS Mutter INNER JOIN Tabellenname AS Kind auf parent.user_ip = child.user_ip und DATE_SUB ((parent.date_end -child.date_start), INTERVAL 20 HOUR) und parent.user_id = child.user_id; – Nyranith

Antwort

0
SELECT parent.* FROM userip parent 
       JOIN userip child ON parent.`user_ip` != child.`user_ip` 
       WHERE ABS(parent.`date_end` - child.date_start) <= 20 
         AND parent.user_id = child.user_id 
GROUP BY parent.user_id 
+0

Würde dies nicht zweimal die Benutzer-ID anzeigen? Jedes Auftreten von ID 1 wird irgendwann zu einem Elternteil. Einer wäre 18, während der andere -18 wäre. Mit dem ABS wären beide 18. Auch ohne das ABS wäre es unter 20. Das OP verlangt eindeutig (also nur einmal). Ich bin mir nicht sicher, ob es wichtig wäre zu OP, aber Sie könnten sagen <= 20 and > = 0 dann loswerden der ABS, es sei denn MySQL würde das nicht mögen. – CodyMR

+0

Ich denke, wir sind nur besorgt über Benutzer-IDs, so dass sie nur einmal erscheinen, wenn sie mit userid gruppiert werden. Sie haben Recht Kind kann wieder Eltern werden und Bedingung kann wieder wahr sein, die den Benutzer wieder erscheinen lassen kann. Wenn wir also nicht nach den wahren Bedingungen für einen Benutzer suchen wollen, funktioniert die Gruppierung –

+0

Richtig. Ich habe die GROUP BY ganz vergessen, die du am Ende hattest. War zu konzentriert auf den Rest davon:) – CodyMR

Verwandte Themen