2014-07-09 67 views
0

我想弄清楚我們應用程序的保留用戶使用我們爲每個用戶保留的登錄歷史記錄。如何加入多個MySQL查詢

我想知道是誰在月1註冊用戶,然後回來在2月份,那麼也回來了3個月等等.....

一個查詢很簡單:

上述

查詢1

SELECT DISTINCT player_id 
FROM login_history 
WHERE timestamp BETWEEN UNIX_TIMESTAMP('2014-01-01 00:00:00') 
AND (UNIX_TIMESTAMP('2014-02-01 00:00:00')-1); 

給我唯一的登錄爲January,簡單。

查詢2

SELECT DISTINCT player_id 
FROM login_history 
WHERE timestamp BETWEEN UNIX_TIMESTAMP('2014-02-01 00:00:00') 
AND (UNIX_TIMESTAMP('2014-03-01 00:00:00')-1); 

上面現在給我的唯一的登錄信息,February

我該如何加入這兩個或更多,才能給我player_id對所有結果的共同點?

我已經在語句中使用嘗試,但就是巨大的慢..

任何建議,將不勝感激

感謝

回答

4

使用group byhaving代替distinct

SELECT player_id 
FROM login_history 
GROUP BY player_id 
HAVING SUM(timestamp BETWEEN UNIX_TIMESTAMP('2014-01-01 00:00:00') AND (UNIX_TIMESTAMP('2014-02-01 00:00:00')-1)) > 0 and 
     SUM(timestamp BETWEEN UNIX_TIMESTAMP('2014-02-01 00:00:00') AND (UNIX_TIMESTAMP('2014-03-01 00:00:00')-1)) > 0; 

爲了提高效率,您應該還包括where

SELECT player_id 
FROM login_history 
WHERE timestamp BETWEEN UNIX_TIMESTAMP('2014-01-01 00:00:00') AND (UNIX_TIMESTAMP('2014-03-01 00:00:00')-1) 
GROUP BY player_id 
HAVING SUM(timestamp BETWEEN UNIX_TIMESTAMP('2014-01-01 00:00:00') AND (UNIX_TIMESTAMP('2014-02-01 00:00:00')-1)) > 0 and 
     SUM(timestamp BETWEEN UNIX_TIMESTAMP('2014-02-01 00:00:00') AND (UNIX_TIMESTAMP('2014-03-01 00:00:00')-1)) > 0; 
+0

這很好,除了我需要添加registration_datetime作爲player_id的驗證。 所以,我只想檢查player_id的registration_datetime是在兩個日期之間... select player_id from player where registration_datetime LIKE'2013-12-01 00:00:00'; – Staggan

+0

@Staggen。 。 。如果你想獲得其他領域,那麼這是另一個問題。我建議你問另一個問題。 –

+0

會不會,道歉... – Staggan

0

也許這不是最好的答案,但是,你只需要把另一個條件,它就完成了。

SELECT DISTINCT 
    player_id 
FROM login_history 
WHERE (timestamp BETWEEN UNIX_TIMESTAMP('2014-01-01 00:00:00') 
     AND (UNIX_TIMESTAMP('2014-02-01 00:00:00') - 1)) 
    OR (timestamp BETWEEN UNIX_TIMESTAMP('2014-02-01 00:00:00') 
     AND (UNIX_TIMESTAMP('2014-03-01 00:00:00') - 1)); 
0

另一種解決方案可以用別名

SELECT DISTINCT lh1.player_id 
FROM login_history lh1 join login_history lh2 on lh1.player_id = lh2.player_id 
WHERE lh1.timestamp BETWEEN UNIX_TIMESTAMP('2014-01-01 00:00:00') 
AND (UNIX_TIMESTAMP('2014-02-01 00:00:00')-1) 
AND lh2.timestamp BETWEEN UNIX_TIMESTAMP('2014-02-01 00:00:00') 
AND (UNIX_TIMESTAMP('2014-03-01 00:00:00')-1); 

再次使用相同的表。如果行數是太高,你可以使用子查詢

SELECT DISTINCT lh1.player_id 
FROM 
(Select distinct player_id from login_history 
WHERE lh1.timestamp BETWEEN UNIX_TIMESTAMP('2014-01-01 00:00:00') 
AND (UNIX_TIMESTAMP('2014-02-01 00:00:00')-1))lh1 
JOIN 
(Select distinct player_id from login_history 
WHERE lh2.timestamp BETWEEN UNIX_TIMESTAMP('2014-02-01 00:00:00') 
AND (UNIX_TIMESTAMP('2014-03-01 00:00:00')-1))lh2 on lh1.player_id = lh2.player_id; 

希望它能幫助。 此致敬禮。