2016-07-21 64 views
0

我有MySQL的選擇用戶的ID連續行值及條件

  • ROW_ID(初級)
  • USER_ID
  • user_ip
  • DATE_START(Unix時間戳)
  • DATE_END一個MySQL表(unix時間戳)

我想只選擇用戶ID此表(不同)IF有至少2點連續的行WHERE

在[行X]的user_ip是與在user_ip不同[行X + 1]

AND

ABS(在[行X] DATE_END - 在DATE_START [行X + 1])< = 20

行應按row_id ASC進行排序,以便我們可以連續獲取行X,X + 1等。

我用PHP很容易做到了這一點,但它非常慢,所以我認爲可以使用sql來完成。

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 

從這一點,我們應該得到公正的用戶ID 1,因爲用戶ID 1 2個連續行+第一行的DATE_END(1469100099)有不同的IP - 日期下一行開始1(469100117)= 18這就是< = 20.

我們不應該返回用戶ID 2,因爲雖然它驗證了第一個條件,但它不會驗證第二個條件與date_end和DATE_START。

+0

看:stackoverflow.com/questions/9824948/...並嘗試這樣的事情: SELECT parent.id FROM表名父內部聯接的表名AS孩子在parent.user_ip = child.user_ip和DATE_SUB ((parent.date_end -child.date_start),INTERVAL 20 HOUR)和parent.user_id = child.user_id; – Nyranith

回答

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

這不會顯示用戶ID兩次嗎? ID 1的所有外觀將在某個時刻成爲父母。一個是18,而另一個是-18。 ABS的數量都是18個。即使沒有ABS,也不到20個.OP要求不同(只有一次)。我不確定是否對OP有影響,但你可以說<= 20 and > = 0然後擺脫ABS,除非MySQL不會那樣。 – CodyMR

+0

我認爲我們只關注用戶標識,因此用userid進行分組只會讓它們出現一次。你是對的孩子可能再次成爲父母並且情況會再次變爲真實,這會使得用戶再次出現。因此,除非我們想要爲用戶查找每個真實條件,否則分組將起作用 –

+0

正確。我完全忘了你最後的GROUP BY。太專注於其餘的部分了:) – CodyMR