[英]How to join multiple MySQL queries
我試圖使用我們為每個用戶保留的登錄歷史記錄來為我們的應用程序找出保留的用戶。
我想知道在第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?
我已經嘗試過使用IN語句,但這非常慢。
任何建議,將不勝感激
謝謝
使用group by
having
而不是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;
也許這不是最好的答案,但是,您只需要提出另一個條件即可。
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));
另一種解決方案是再次使用具有別名的同一表
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;
希望能有所幫助。 問候。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.